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:
輸出結果:[3, 4, 2, 1, 5, 7, 6]
但是,對于基礎類型(比如byte,int,float等)千萬不要想著這么實現(案例1-2,勿效仿):
因為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]):
案例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:
輸出:
[s1, s2, s3, s4] 04. copyOf
數組拷貝,底層采用System.arrayCopy(native方法)實現。
案例4-1:
輸出:[s2, s4, s1, s3]
5. copyOfRange
數組拷貝,指定一定的范圍,譬如(public static T[] copyOfRange(T[] original, int from, int to))。底層采用System.arrayCopy(native方法)實現。
案例5-1:
輸出:[s4, s1]
6. equals和deepEquals
equals:判斷兩個數組的每一個對應的元素是否相等(equals, 對于兩個數組的元素o1和o2有o1==null ? o2==null : o1.equals(o2))。
案例6-1:
輸出:true
deepEquals:主要針對一個數組中的元素還是數組的情況,類似deepToString, deepHashCode如下:
案例6-1:
輸出結果:
false true7. fill
給數組賦值。填充數組之用。
案例7-1:
輸出:
[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:
輸出結果:
[[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:
運行結果:
-1683374023 31646847這樣可以看到hashCode與deepHashCode的區別。對于數組而言hashCode只調用到它第一層元素,deepHashCode會一直調用直至不能再拆分成數組的元素。
參考資料:
歡迎跳轉到本文的原文鏈接:https://honeypps.com/java/java-collection-arrays/
歡迎支持筆者新作:《深入理解Kafka:核心設計與實踐原理》和《RabbitMQ實戰指南》,同時歡迎關注筆者的微信公眾號:朱小廝的博客。
總結
以上是生活随笔為你收集整理的Java集合框架:Arrays工具类的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java集合框架:Set(HashSet
- 下一篇: Java集合框架:Collections