說明:Collections 是為了方便使用集合而產(chǎn)生的工具類,Arrays 方便數(shù)組使用,Collections 是方便集合使用蚕苇。
Collections 也提供了 sort 和 binarySearch 方法这弧,sort 底層使用的就是 Arrays.sort 方法,
binarySearch 底層是自己重寫了二分查找算法瓶颠,實(shí)現(xiàn)的邏輯和 Arrays 的二分查找算法完全一 致,這兩個(gè)方法上 Collections 和 Arrays 的內(nèi)部實(shí)現(xiàn)很類似刺桃,接下來我們來看下 Collections
獨(dú)有的特性粹淋。
1.1 求集合中最大、小值
提供了 max 方法來取得集合中的最大值,min 方法來取得集合中的最小值桃移,我們以 max 方法為例來說明一下屋匕,max 提供了兩種類型的方法,一個(gè)需要傳外部排序器借杰,一個(gè)不需要傳排序器过吻,但需要集合中的元素強(qiáng)制實(shí)現(xiàn) Comparable 接口,后者的泛型定義很有意思蔗衡,我們來看下(從右往左看):
1.2 線程安全的集合
Collections 對(duì)原始集合類進(jìn)行了封裝纤虽,提供了更好的集合類給我們,一種是線程安全的集合绞惦,
一種是不可變的集合廓推,針對(duì) List、Map翩隧、Set 都有提供樊展,我們先來看下線程安全的集合:
如:Collections.synchronizedList()
1.3 不可變的集合
只開放了查詢方法,其余任何修改操作都會(huì)拋出異常堆生,我們以 unmodifiableList 為例來看下
底層實(shí)現(xiàn)機(jī)制:
還有sort(指定排序)专缠、shuffle(隨機(jī)排序)、binarySearch(二分查找)淑仆、indexOfSubList(查找subList在list中首次出現(xiàn)位置的索引)涝婉、 lastIndexOfSubList、reverse()蔗怠、fill(用對(duì)象o替換集合list中的所有元素)
1.4 常見工具類問題
1)工作中有沒有遇到特別好用的工具類墩弯,如何寫好一個(gè)工具類
答:有的,像 Arrays 的排序寞射、二分查找渔工、Collections 的不可變、線程安全集合類桥温、Objects
的判空相等判斷等等工具類引矩,好的工具類肯定很好用,比如說使用 static final 關(guān)鍵字對(duì)方法進(jìn)
行修飾侵浸,工具類構(gòu)造器必須是私有等等手段來寫好工具類旺韭。
public final class Objects {
private Objects() {
}
public static boolean equals(Object a, Object b) {
return (a == b) || (a != null && a.equals(b));
}
public static boolean isNull(Object obj) {
return obj == null;
}
}
2)寫一個(gè)二分查找算法的實(shí)現(xiàn)
答:可以參考 Arrays 的 binarySearch 方法的源碼實(shí)現(xiàn)。
public int binarySearch(int[] arr , int value){
if(arr == null || arr.length <= 0){
return -1;
}
int low = 0, high = arr.length -1;
while(low <= high){
int mid = low + ((high - low)>>>1)
if(arr[mid] == value){
return mid;
}else if(arr[mid] > value){
high = mid - 1;
}else{
low = mid + 1;
}
}
if(low > high){
return -1;
}
}
3)如果我希望 ArrayList 初始化之后掏觉,不能被修改区端,該怎么辦
答:可以使用 Collections 的 unmodifiableList 的方法,該方法會(huì)返回一個(gè)不能被修改的內(nèi)部類集合澳腹,這些集合類只開放查詢的方法织盼,對(duì)于調(diào)用修改集合的方法會(huì)直接拋出異常杨何。