轉載請註明原創出處,謝謝!
在平時寫代碼的過程中集合會經常被用到,類似於 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