日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

Java集合框架:Arrays工具类

發布時間:2024/4/11 java 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Java集合框架:Arrays工具类 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

歡迎支持筆者新作:《深入理解Kafka:核心設計與實踐原理》和《RabbitMQ實戰指南》,同時歡迎關注筆者的微信公眾號:朱小廝的博客。


歡迎跳轉到本文的原文鏈接:https://honeypps.com/java/java-collection-arrays/

java.util.Arrays類能方便地操作數組,它提供的方法都是靜態的。整個Arrays工具類的實現有3000+行,但是歸納總結一下可知它有以下功能(9個):


1. asList

定義:

@SafeVarargspublic static <T> List<T> asList(T... a) {return new ArrayList<>(a);}

功能:將一個數組(變長參數的語法糖實現就是數組)轉變成一個List(確切的來說是ArrayList),注意這個List是定長的,企圖添加或者刪除數據都會報錯(java.lang.UnsupportedOperationException).
譬如案例1-1:

List<Integer> list = Arrays.asList(3,4,2,1,5,7,6);System.out.println(list);

輸出結果:[3, 4, 2, 1, 5, 7, 6]
但是,對于基礎類型(比如byte,int,float等)千萬不要想著這么實現(案例1-2,勿效仿):

int a[] = new int[]{1,2,5,4,6,8,7,9};List list = Arrays.asList(a);

因為List list = Arrays.asList(a);會變成List<int[]> list = Arrays.asList(a);所以遍歷需要這樣:

for(int[] arr:list){for(int i:arr){System.out.println(i);}}

這樣操作就顯得非常的煩瑣。因為預想List是List<Integer>形式的,沒想到是List<int[]>形式的。使用的時候要特別的注意一下。


2. sort

對數組進行排序。適合byte,char,double,float,int,long,short等基本類型,還有Object類型(實現了Comparable接口),如果提供了比較器Comparator也可以適用于泛型。
案例2-1(基礎類型,輸出:[1, 1, 4, 4, 5, 6, 7, 9]):

int a[] = new int[]{1,9,5,4,6,4,7,1};Arrays.sort(a);System.out.println(Arrays.toString(a));

案例2-2(String類型(Object),實現了Comparable接口,輸出:[s1, s2, s3, s4]):

String str[] = {"s2","s4","s1","s3"};Arrays.sort(str);System.out.println(Arrays.toString(str));

案例2-3 (自定義類型,實現了Comparable接口,輸出:[jj:17, zzh:18, qq:19]):

Person1 persons[] = new Person1[]{new Person1("zzh",18),new Person1("jj",17),new Person1("qq",19)};Arrays.sort(persons);System.out.println(Arrays.toString(persons));

案例2-4(泛型,如果類型沒有實現Comparable接口,可以通過Comparator實現排序):

Person2 persons2[] = new Person2[]{new Person2("zzh",18),new Person2("jj",17),new Person2("qq",19)};Arrays.sort(persons2,new Comparator<Person2>(){@Overridepublic int compare(Person2 o1, Person2 o2){if(o1 == null || o2 == null)return 0;return o1.getAge()-o2.getAge();}});System.out.println(Arrays.toString(persons2));

輸出:[jj:17, zzh:18, qq:19]
關于類Person1和類Person2的詳細細節可以參考《Comparable與Comparator淺析》


3. binarySearch

通過二分查找法對已排序(譬如經過Arrays.sort排序,且按照升序進行排序。如果數組沒有經過排序,那么檢索結果未知)的數組進行查找。適合byte,char,double,float,int,long,short等基本類型,還有Object類型和泛型(參考sort那段)
案例3-1:

String str[] = {"s2","s4","s1","s3"};Arrays.sort(str);System.out.println(Arrays.toString(str));int ans = Arrays.binarySearch(str, "s1");System.out.println(ans);

輸出:

[s1, s2, s3, s4] 0

4. copyOf

數組拷貝,底層采用System.arrayCopy(native方法)實現。
案例4-1:

String str[] = {"s2","s4","s1","s3"};String str2[] = Arrays.copyOf(str, str.length);System.out.println(Arrays.toString(str2));

輸出:[s2, s4, s1, s3]


5. copyOfRange

數組拷貝,指定一定的范圍,譬如(public static T[] copyOfRange(T[] original, int from, int to))。底層采用System.arrayCopy(native方法)實現。
案例5-1:

String str[] = {"s2","s4","s1","s3"};String str2[] = Arrays.copyOfRange(str,1,3);System.out.println(Arrays.toString(str2));

輸出:[s4, s1]


6. equals和deepEquals

equals:判斷兩個數組的每一個對應的元素是否相等(equals, 對于兩個數組的元素o1和o2有o1==null ? o2==null : o1.equals(o2))。
案例6-1:

String str1[] = {"s2","s4","s1","s3",null};String str2[] = Arrays.copyOf(str1, str1.length);System.out.println(Arrays.equals(str1, str2));

輸出:true
deepEquals:主要針對一個數組中的元素還是數組的情況,類似deepToString, deepHashCode如下:
案例6-1:

int a1[] = new int[]{1,2,3};int a2[] = new int[]{1,3,3};int a3[] = new int[]{4,3,2,1};int a4[] = new int[]{1,2,3};int a5[] = new int[]{1,3,3};int a6[] = new int[]{4,3,2,1};int[] a [] = new int[][]{a1,a2,a3};int[] b [] = new int[][]{a4,a5,a6};System.out.println(Arrays.equals(a, b));System.out.println(Arrays.deepEquals(a, b));

輸出結果:

false true

7. fill

給數組賦值。填充數組之用。
案例7-1:

String str[] = {"s2","s4","s1","s3",null};System.out.println(Arrays.toString(str));Arrays.fill(str, "s5");System.out.println(Arrays.toString(str));

輸出:

[s2, s4, s1, s3, null] [s5, s5, s5, s5, s5]

8. toString和deepToString

toString:對于一個數組int a[] = new int[]{1,9,5,4,6,4,7,1};如果按照System.out.println(a);打印企圖可以打印出[1,9,5,4,6,4,7,1],實際上只會打印出[I@3e2de41d這種。在打印數組的時候需要寫成Arrays.toString(a)的形式。可參考sort的詳解。
deepToString:當數組中又包含數組,那么就不能單存的利用Arrays.toString()了,請看例子。
案例8-1:

int a1[] = new int[]{1,2,3};int a2[] = new int[]{1,3,3};int a3[] = new int[]{4,3,2,1};int[] a [] = new int[][]{a1,a2,a3};System.out.println(Arrays.toString(a));System.out.println(Arrays.deepToString(a));

輸出結果:

[[I@1b6b7f83, [I@2e807f85, [I@76340c9c] [[1, 2, 3], [1, 3, 3], [4, 3, 2, 1]]

相信各位應該看到差別了吧。


9. hashCode和deepHashCode

hashCode:計算一個數組的hashCode.對于一個數組Object[], hashCode方法返回的值取決于:數組中每個元素的元素oi.hashCode()的值初級計算result = 31 * result + (oi== null ? 0 : oi.hashCode());
deepHashCode: 對于一個數組Object[], deepHashCode取決于:數組中每個元素oi,如果oi還是一個數組,那么就繼續深入的去獲取hashCode,這段比較繞,來個例子比較形象。
案例9-1:

int a1[] = new int[]{1,2,3};int a2[] = new int[]{1,3,3};int a3[] = new int[]{4,3,2,1};int[] a [] = new int[][]{a1,a2,a3};System.out.println(Arrays.hashCode(a));System.out.println(Arrays.deepHashCode(a));

運行結果:

-1683374023 31646847

這樣可以看到hashCode與deepHashCode的區別。對于數組而言hashCode只調用到它第一層元素,deepHashCode會一直調用直至不能再拆分成數組的元素。


參考資料:

  • 《Comparable與Comparator淺析》
  • 歡迎跳轉到本文的原文鏈接:https://honeypps.com/java/java-collection-arrays/


    歡迎支持筆者新作:《深入理解Kafka:核心設計與實踐原理》和《RabbitMQ實戰指南》,同時歡迎關注筆者的微信公眾號:朱小廝的博客。


    總結

    以上是生活随笔為你收集整理的Java集合框架:Arrays工具类的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。