圖學java基礎篇之集合工具

兩個工具類

java.utils下又兩個集合相關_(準確來講其中一個是數組的)_的工具類:Arrays和Collections,其中提供了不少針對集合的操做,其中涵蓋了一下幾個方面:html

  • 拷貝、填充、反轉等經常使用的基本操做
  • 排序、查找等算法相關處理
  • 安全性相關處理
  • 類型轉換

下邊直接用兩個圖來講明_(其中三言兩語說不清的會標紅,並在後邊打上標記,在圖後有對應說明)_:java

Arrays

sort中的多種排序算法

印象中JDK不少地方都是快排和歸併,這裏也不例外,不過這裏用的都是優化的算法,而且根據排序元素類型策略不一樣:git

  • DualPivotQuicksort
    • 全部數值基本類型均用此排序,JDK7中新增
    • 雙基準快速排,改進的多路快排算法
  • ComparableTimSort
    • 默認引用類型均用此排序,JDK7中新增
    • 基於TimSort,該算法是優化版本的歸併排序,混合使用了歸併和插入排序
  • LegacyMergeSort
    • 老版本中的排序算法,JDK7中爲兼容仍保留,若想使用可經過-Djava.util.Arrays.useLegacyMergeSort=true
    • 優化的歸併排序,可是性能較TimSort差
asList需注意的點

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

這個倒沒啥好說的,這裏直接貼代碼吧,主要看下集合的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;
        }
    }
deepXXX

就如同拷貝分爲深拷貝和淺拷貝同樣,因爲集合多是多層的,集合內的元素可能仍是一個集合,所以對於集合的不少操做默認是隻處理一層,如hashCode、equals、toString,這樣對於多層的處理就不是咱們指望的結果了。所以Arrays還提供了deepXXX的方法,其會遞歸的逐層處理。安全

Collections

unmodifiableXXXX、synchronizedXXX、checkedXXXX

這三個方法功能各不相同,unmodifiableXXXX返回一個不可修改的副本,synchronizedXXX範圍一個線程安全的副本,checkedXXXX返回的副本會對添加操做進行類型檢查(這裏說副本並不許確,其實操做的仍是原對象),這裏之因此要放在一塊兒說,由於他們有不少共同之處:函數

  • 均使用包裝模式實現,將傳入對象做爲私有屬性,而後經過對其操做進行包裝實現對應功能
  • 操做的都是原對象,原對象的修改也會體如今包裝的對象上
  • 都支持list、set、map

(原圖和相關xmind文件見:github)工具

相關文章
相關標籤/搜索