说明:Collections 是为了方便使用集合而产生的工具类,Arrays 方便数组使用,Collections 是方便集合使用。
Collections 也提供了 sort 和 binarySearch 方法,sort 底层使用的就是 Arrays.sort 方法,
binarySearch 底层是自己重写了二分查找算法,实现的逻辑和 Arrays 的二分查找算法完全一 致,这两个方法上 Collections 和 Arrays 的内部实现很类似,接下来我们来看下 Collections
独有的特性。
1.1 求集合中最大、小值
提供了 max 方法来取得集合中的最大值,min 方法来取得集合中的最小值,我们以 max 方法为例来说明一下,max 提供了两种类型的方法,一个需要传外部排序器,一个不需要传排序器,但需要集合中的元素强制实现 Comparable 接口,后者的泛型定义很有意思,我们来看下(从右往左看):
1.2 线程安全的集合
Collections 对原始集合类进行了封装,提供了更好的集合类给我们,一种是线程安全的集合,
一种是不可变的集合,针对 List、Map、Set 都有提供,我们先来看下线程安全的集合:
如:Collections.synchronizedList()
1.3 不可变的集合
只开放了查询方法,其余任何修改操作都会抛出异常,我们以 unmodifiableList 为例来看下
底层实现机制:
还有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 的方法,该方法会返回一个不能被修改的内部类集合,这些集合类只开放查询的方法,对于调用修改集合的方法会直接抛出异常。