集合工具類 Collections 的介紹

轉載請註明原創出處,謝謝!

HappyFeet的博客

在平時寫代碼的過程中集合會經常被用到,類似於 Map、List、Set 等等,相應的,集合工具類也會被頻繁的使用,下面我們來瞅一瞅 java.util 包下的 Collections 類提供了哪些有用的方法。


1、Collections 類介紹

    // Suppresses default constructor, ensuring non-instantiability.
    private Collections() {
    }

首先,Collections 類將自己的構造函數私有化,保證不會創建 Collections 的實例(自己項目中寫的工具類也應該是這樣)。

    private static final int BINARYSEARCH_THRESHOLD   = 5000;
    private static final int REVERSE_THRESHOLD        =   18;
    private static final int SHUFFLE_THRESHOLD        =    5;
    private static final int FILL_THRESHOLD           =   25;
    private static final int ROTATE_THRESHOLD         =  100;
    private static final int COPY_THRESHOLD           =   10;
    private static final int REPLACEALL_THRESHOLD     =   11;
    private static final int INDEXOFSUBLIST_THRESHOLD =   35;

緊接着,聲明瞭許多閥值,這些閥值是做啥用的呢?稍安勿躁,人家在文檔裏面說明了, 許多 List 算法有兩種實現,其中一種適用於 RandomAccess 列表,而另一種則適用於 sequential 列表;通常來說,隨機存取列表和數量不大的順序列表使用 RandomAccess 算法擁有更好的性能,所以上面的閥值就是爲順序列表挑選算法用的。而爲什麼 BINARYSEARCH_THRESHOLD=5000 而不是 3000 呢?因爲這是由性能測試工作人員不斷的驗證之後得到的結果,而不是隨隨便便寫上去的,其他的閥值亦是如此。

好的,接下來就是具體的工具方法了。

以下幾個方法都是針對於 List 的:

(1)sort:排序,要求 List 中的所有元素可比較,Collections 中提供了兩個方法排序。

  • void sort(List<T> list) :直接傳一個 List ,按照自然順序排序;

  • void sort(List<T> list, Comparator<? super T> c) :傳入一個 List 和一個 Comparator,根據 Comparator 排序。

(2)binarySearch:二分查找,要求 List 中元素有序。

  • int binarySearch(List<? extends Comparable<? super T>> list, T key) : List 必須是有序的,且按照自然順序排序;

  • int binarySearch(List<? extends T> list, T key, Comparator<? super T> c) : List 和一個 Comparator,List 必須有序,且根據 Comparator 排序。

(3)reverse:反轉。

  • void reverse(List<?> list) :將 List 反轉

(4)shuffle:洗牌,打亂順序。

  • void shuffle(List<?> list):按照系統自動生成的隨機數將 List 順序打亂;

  • void shuffle(List<?> list, Random rnd):按照指定的隨機數將 List 順序打亂。

下面的方法是針對於 Collection 的:

(5)min/max:求極值,求集合的最大值和最小值,均提供了兩種方式,自然排序及指定排序規則。

  • T min(Collection<? extends T> coll)

  • T max(Collection<? extends T> coll)

  • T min(Collection<? extends T> coll, Comparator<? super T> comp)

  • T max(Collection<? extends T> coll, Comparator<? super T> comp)

(6)unmodifiable**:返回 ** 的一個不可變的 view,例如 unmodifiableMap 就是返回一個不可變的 Map 的 view。

  • **<T> unmodifiable**(**<? extends T> c)

(7)synchronized**:返回一個實現了同步的 ** ,例如 synchronizedMap 就是返回一個實現同步的 Map 。

  • **<T> synchronized**(**<? extends T> c)

備註:6 和 7 都是通過靜態內部類實現的,在傳入的集合外封裝了一層,添加了 unmodifiable 或 synchronized 屬性,從而實現不可變及同步的。

(8)empty** :返回一個單例的、不可變的空集合,例如 emptyMap 就是返回一個 static final 的、不可變的空 Map 。

  • **<T> empty**()

  • 和返回 Optional.empty() 代表沒有一樣,很多情況下,我們返回空的集合來代表沒有或者避免返回 null 值,如果我們能確定在程序後面不會對該集合做修改,那麼返回 Collections.empty**() 會省去新建對象的開銷,因爲它是 static final 的。

(9)以上列出了 Collections 中絕大部分的工具方法,還有些許沒列出來的,基本上也很少用到,有興趣的同學可以去看一下源碼瞭解一下。

2、總結

  • 實際應用中用的最多的方法應該是 sort、binarySearch、min/max 及empty** 。
  • 當需要對 List 排序時,可以直接調用 Collections.sort() 方法;
  • 當要查找 List 中的元素且 List 是有序時,可以使用 Collections.binarySearch;
  • 當需要查找集合中的極值時,調用 Collections.min()/Collections.max();
  • 而需要返回一個空的不可修改的集合時,可以調用 Collections.empty**()。

不積跬步無以至千里,不積小流無以成江河!

不積跬步無以至千里,不積小流無以成江河!

不積跬步無以至千里,不積小流無以成江河!

重要的事說三遍!

參考資料:

(1)https://docs.oracle.com/javase/7/docs/api/java/util/Collections.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章