java.utils下又兩個集合相關_(準確來講其中一個是數組的)_的工具類:Arrays和Collections,其中提供了不少針對集合的操做,其中涵蓋了一下幾個方面:html
下邊直接用兩個圖來講明_(其中三言兩語說不清的會標紅,並在後邊打上標記,在圖後有對應說明)_:java
印象中JDK不少地方都是快排和歸併,這裏也不例外,不過這裏用的都是優化的算法,而且根據排序元素類型策略不一樣:git
asList是咱們常常使用的一個方法,能夠將一組值直接轉成list,可是看下以下代碼:github
int[] arr = new int[3]{1,2,3}; List list = Arrays.asList(arr);
相信大部分同窗初看起來沒什麼問題吧(反正我一直沒以爲有問題),把數組轉成list,而後結果打印list,你會發現其中只有一個元素,這個元素就是arr指向的數組。因此該方法並不能把數組轉爲list,list的構造函數自己就支持數組,不必在提供方法
還要注意的一個點是asList返回了一個ArrayList對象,這個對象並非咱們經常使用的java.utils下的那個,而是Arrays的一個內部類,它是隻讀的,所以咱們要想得到一個不殘疾的list,要這樣寫:算法
List list = new ArrayListArrays.asList(1,2,3);
這個倒沒啥好說的,這裏直接貼代碼吧,主要看下集合的hashCode是怎麼計算的。數組
public static int hashCode(Object[] var0) { if(var0 == null) { return 0; } else { int var1 = 1; Object[] var2 = var0; int var3 = var0.length; for(int var4 = 0; var4 < var3; ++var4) { Object var5 = var2[var4]; var1 = 31 * var1 + (var5 == null?0:var5.hashCode()); } return var1; } }
就如同拷貝分爲深拷貝和淺拷貝同樣,因爲集合多是多層的,集合內的元素可能仍是一個集合,所以對於集合的不少操做默認是隻處理一層,如hashCode、equals、toString,這樣對於多層的處理就不是咱們指望的結果了。所以Arrays還提供了deepXXX的方法,其會遞歸的逐層處理。安全
這三個方法功能各不相同,unmodifiableXXXX返回一個不可修改的副本,synchronizedXXX範圍一個線程安全的副本,checkedXXXX返回的副本會對添加操做進行類型檢查(這裏說副本並不許確,其實操做的仍是原對象),這裏之因此要放在一塊兒說,由於他們有不少共同之處:函數
(原圖和相關xmind文件見:github)工具