Java集合框架:Arrays工具类
歡迎支持筆者新作:《深入理解Kafka:核心設(shè)計與實踐原理》和《RabbitMQ實戰(zhàn)指南》,同時歡迎關(guān)注筆者的微信公眾號:朱小廝的博客。
歡迎跳轉(zhuǎn)到本文的原文鏈接:https://honeypps.com/java/java-collection-arrays/
java.util.Arrays類能方便地操作數(shù)組,它提供的方法都是靜態(tài)的。整個Arrays工具類的實現(xiàn)有3000+行,但是歸納總結(jié)一下可知它有以下功能(9個):
1. asList
定義:
@SafeVarargspublic static <T> List<T> asList(T... a) {return new ArrayList<>(a);}功能:將一個數(shù)組(變長參數(shù)的語法糖實現(xiàn)就是數(shù)組)轉(zhuǎn)變成一個List(確切的來說是ArrayList),注意這個List是定長的,企圖添加或者刪除數(shù)據(jù)都會報錯(java.lang.UnsupportedOperationException).
譬如案例1-1:
輸出結(jié)果:[3, 4, 2, 1, 5, 7, 6]
但是,對于基礎(chǔ)類型(比如byte,int,float等)千萬不要想著這么實現(xiàn)(案例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);}}這樣操作就顯得非常的煩瑣。因為預(yù)想List是List<Integer>形式的,沒想到是List<int[]>形式的。使用的時候要特別的注意一下。
2. sort
對數(shù)組進行排序。適合byte,char,double,float,int,long,short等基本類型,還有Object類型(實現(xiàn)了Comparable接口),如果提供了比較器Comparator也可以適用于泛型。
案例2-1(基礎(chǔ)類型,輸出:[1, 1, 4, 4, 5, 6, 7, 9]):
案例2-2(String類型(Object),實現(xiàn)了Comparable接口,輸出:[s1, s2, s3, s4]):
String str[] = {"s2","s4","s1","s3"};Arrays.sort(str);System.out.println(Arrays.toString(str));案例2-3 (自定義類型,實現(xiàn)了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(泛型,如果類型沒有實現(xiàn)Comparable接口,可以通過Comparator實現(xiàn)排序):
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]
關(guān)于類Person1和類Person2的詳細細節(jié)可以參考《Comparable與Comparator淺析》
3. binarySearch
通過二分查找法對已排序(譬如經(jīng)過Arrays.sort排序,且按照升序進行排序。如果數(shù)組沒有經(jīng)過排序,那么檢索結(jié)果未知)的數(shù)組進行查找。適合byte,char,double,float,int,long,short等基本類型,還有Object類型和泛型(參考sort那段)
案例3-1:
輸出:
[s1, s2, s3, s4] 04. copyOf
數(shù)組拷貝,底層采用System.arrayCopy(native方法)實現(xiàn)。
案例4-1:
輸出:[s2, s4, s1, s3]
5. copyOfRange
數(shù)組拷貝,指定一定的范圍,譬如(public static T[] copyOfRange(T[] original, int from, int to))。底層采用System.arrayCopy(native方法)實現(xiàn)。
案例5-1:
輸出:[s4, s1]
6. equals和deepEquals
equals:判斷兩個數(shù)組的每一個對應(yīng)的元素是否相等(equals, 對于兩個數(shù)組的元素o1和o2有o1==null ? o2==null : o1.equals(o2))。
案例6-1:
輸出:true
deepEquals:主要針對一個數(shù)組中的元素還是數(shù)組的情況,類似deepToString, deepHashCode如下:
案例6-1:
輸出結(jié)果:
false true7. fill
給數(shù)組賦值。填充數(shù)組之用。
案例7-1:
輸出:
[s2, s4, s1, s3, null] [s5, s5, s5, s5, s5]8. toString和deepToString
toString:對于一個數(shù)組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這種。在打印數(shù)組的時候需要寫成Arrays.toString(a)的形式。可參考sort的詳解。
deepToString:當(dāng)數(shù)組中又包含數(shù)組,那么就不能單存的利用Arrays.toString()了,請看例子。
案例8-1:
輸出結(jié)果:
[[I@1b6b7f83, [I@2e807f85, [I@76340c9c] [[1, 2, 3], [1, 3, 3], [4, 3, 2, 1]]相信各位應(yīng)該看到差別了吧。
9. hashCode和deepHashCode
hashCode:計算一個數(shù)組的hashCode.對于一個數(shù)組Object[], hashCode方法返回的值取決于:數(shù)組中每個元素的元素oi.hashCode()的值初級計算result = 31 * result + (oi== null ? 0 : oi.hashCode());
deepHashCode: 對于一個數(shù)組Object[], deepHashCode取決于:數(shù)組中每個元素oi,如果oi還是一個數(shù)組,那么就繼續(xù)深入的去獲取hashCode,這段比較繞,來個例子比較形象。
案例9-1:
運行結(jié)果:
-1683374023 31646847這樣可以看到hashCode與deepHashCode的區(qū)別。對于數(shù)組而言hashCode只調(diào)用到它第一層元素,deepHashCode會一直調(diào)用直至不能再拆分成數(shù)組的元素。
參考資料:
歡迎跳轉(zhuǎn)到本文的原文鏈接:https://honeypps.com/java/java-collection-arrays/
歡迎支持筆者新作:《深入理解Kafka:核心設(shè)計與實踐原理》和《RabbitMQ實戰(zhàn)指南》,同時歡迎關(guān)注筆者的微信公眾號:朱小廝的博客。
總結(jié)
以上是生活随笔為你收集整理的Java集合框架:Arrays工具类的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java集合框架:Set(HashSet
- 下一篇: Java集合框架:Collections