Collections常用方法源码解析

说明:Collections 是为了方便使用集合而产生的工具类,Arrays 方便数组使用,Collections 是方便集合使用。
Collections 也提供了 sort 和 binarySearch 方法,sort 底层使用的就是 Arrays.sort 方法,
binarySearch 底层是自己重写了二分查找算法,实现的逻辑和 Arrays 的二分查找算法完全一 致,这两个方法上 Collections 和 Arrays 的内部实现很类似,接下来我们来看下 Collections
独有的特性。

1.1 求集合中最大、小值

提供了 max 方法来取得集合中的最大值,min 方法来取得集合中的最小值,我们以 max 方法为例来说明一下,max 提供了两种类型的方法,一个需要传外部排序器,一个不需要传排序器,但需要集合中的元素强制实现 Comparable 接口,后者的泛型定义很有意思,我们来看下(从右往左看):


image.png
1.2 线程安全的集合

Collections 对原始集合类进行了封装,提供了更好的集合类给我们,一种是线程安全的集合,
一种是不可变的集合,针对 List、Map、Set 都有提供,我们先来看下线程安全的集合:
如:Collections.synchronizedList()


image.png
1.3 不可变的集合

只开放了查询方法,其余任何修改操作都会抛出异常,我们以 unmodifiableList 为例来看下
底层实现机制:


image.png

还有sort(指定排序)、shuffle(随机排序)、binarySearch(二分查找)、indexOfSubList(查找subList在list中首次出现位置的索引)、 lastIndexOfSubList、reverse()、fill(用对象o替换集合list中的所有元素)

1.4 常见工具类问题

1)工作中有没有遇到特别好用的工具类,如何写好一个工具类
答:有的,像 Arrays 的排序、二分查找、Collections 的不可变、线程安全集合类、Objects
的判空相等判断等等工具类,好的工具类肯定很好用,比如说使用 static final 关键字对方法进
行修饰,工具类构造器必须是私有等等手段来写好工具类。

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)写一个二分查找算法的实现
答:可以参考 Arrays 的 binarySearch 方法的源码实现。

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 的方法,该方法会返回一个不能被修改的内部类集合,这些集合类只开放查询的方法,对于调用修改集合的方法会直接抛出异常。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。