圖學java基礎篇之集合工具

jopen 9年前發布 | 18K 次閱讀 Java開發 Java

java基礎復習鞏固。由于是總結,并不會細講知識點,每篇都會放出該部分知識結構圖,之后有必要的話進行一些文字說明。

兩個工具類

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

  • 拷貝、填充、反轉等常用的基本操作
  • 排序、查找等算法相關處理
  • 安全性相關處理
  • 類型轉換
  • </ul>

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

    Arrays

    圖學java基礎篇之集合工具

    sort中的多種排序算法

    印象中JDK很多地方都是快排和歸并,這里也不例外,不過這里用的都是優化的算法,并且根據排序元素類型策略不同:

    • DualPivotQuicksort

      • 所有數值基本類型均用此排序,JDK7中新增
      • 雙基準快速排,改進的多路快排算法
      • </ul> </li>

      • ComparableTimSort

        • 默認引用類型均用此排序,JDK7中新增
        • 基于TimSort,該算法是優化版本的歸并排序,混合使用了歸并和插入排序
        • </ul> </li>

        • LegacyMergeSort

          • 老版本中的排序算法,JDK7中為兼容仍保留,若想使用可通過-Djava.util.Arrays.useLegacyMergeSort=true
          • 優化的歸并排序,但是性能較TimSort差
          • </ul> </li> </ul>
            asList需注意的點

            asList是我們經常使用的一個方法,可以將一組值直接轉成list,但是看下如下代碼:

            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

            圖學java基礎篇之集合工具

            unmodifiableXXXX、synchronizedXXX、checkedXXXX

            這三個方法功能各不相同,unmodifiableXXXX返回一個不可修改的副本,synchronizedXXX范圍一個線程安全的副 本,checkedXXXX返回的副本會對添加操作進行類型檢查(這里說副本并不準確,其實操作的還是原對象),這里之所以要放在一起說,因為他們有很多 共同之處:

            • 均使用包裝模式實現,將傳入對象作為私有屬性,然后通過對其操作進行包裝實現對應功能
            • 操作的都是原對象,原對象的修改也會體現在包裝的對象上
            • 都支持list、set、map
            • </ul>

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

              來自:http://my.oschina.net/goodtemper/blog/524298

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!