Collections常用方法源碼解析

說(shuō)明: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)很類似,接下來(lái)我們來(lái)看下 Collections
獨(dú)有的特性。

1.1 求集合中最大、小值

提供了 max 方法來(lái)取得集合中的最大值,min 方法來(lái)取得集合中的最小值,我們以 max 方法為例來(lái)說(shuō)明一下,max 提供了兩種類型的方法,一個(gè)需要傳外部排序器,一個(gè)不需要傳排序器,但需要集合中的元素強(qiáng)制實(shí)現(xiàn) Comparable 接口,后者的泛型定義很有意思,我們來(lái)看下(從右往左看):


image.png
1.2 線程安全的集合

Collections 對(duì)原始集合類進(jìn)行了封裝,提供了更好的集合類給我們,一種是線程安全的集合,
一種是不可變的集合,針對(duì) List、Map、Set 都有提供,我們先來(lái)看下線程安全的集合:
如:Collections.synchronizedList()


image.png
1.3 不可變的集合

只開放了查詢方法,其余任何修改操作都會(huì)拋出異常,我們以 unmodifiableList 為例來(lái)看下
底層實(shí)現(xiàn)機(jī)制:


image.png

還有sort(指定排序)、shuffle(隨機(jī)排序)、binarySearch(二分查找)、indexOfSubList(查找subList在list中首次出現(xiàn)位置的索引)、 lastIndexOfSubList、reverse()、fill(用對(duì)象o替換集合list中的所有元素)

1.4 常見(jiàn)工具類問(wèn)題

1)工作中有沒(méi)有遇到特別好用的工具類,如何寫好一個(gè)工具類
答:有的,像 Arrays 的排序、二分查找、Collections 的不可變、線程安全集合類、Objects
的判空相等判斷等等工具類,好的工具類肯定很好用,比如說(shuō)使用 static final 關(guān)鍵字對(duì)方法進(jìn)
行修飾,工具類構(gòu)造器必須是私有等等手段來(lái)寫好工具類。

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ì)直接拋出異常。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容