Arrays、Collections、Objects 常用方法源码解析
我们在工作中都会写工具类,但如何才能使写出来的工具类更好用,也是有一些技巧的。现在我们以三种平时工作中经常使用的工具类为例,从使用案例出发,再看看底层源码的实现,看看能否学习到一些工具类的技巧,以及三种工具类的实际使用场景。
一:工具类的通用特征
一般一个工具类一般有一下几个特点:
- 构造器必须是私有的。这样的话,工具类就无法被 new 出来,因为工具类在使用的时候,无需初始化,直接使用即可,所以不会开放出构造器出来;
- 具类的工具方法必须被 static、final 关键字修饰。这样的话就可以保证方法不可变,并且可以直接使用,非常方便;
我们需要注意的是,尽量不要在工具方法中,对共享变量有做修改的操作访问(如果必须要做的话,必须加锁),因为会有线程安全的问题。除此之外,工具类方法本身是没有线程安全问题的,可以放心使用。
二: Arrays
Arrays 主要对数组提供了一些高效的操作,比如说排序、查找、填充、拷贝、相等判断等等。
2.1、排序(Arrays.sort())
Arrays.sort 方法主要用于排序,入参支持 int、long、double 等各种基本类型的数组,也支持自定义类的数组,下面我们写个 demo 来演示一下自定义类数组的排序:
@Data
class SortDTO {
private int sortTarget;
public SortDTO(int sortTarget) {
this.sortTarget = sortTarget;
}
public int getSortTarget() {
return sortTarget;
}
}
@Test
public void testSort() {
List<SortDTO> list = ImmutableList.of(
new SortDTO(300),
new SortDTO(50),
new SortDTO(200),
new SortDTO(220)
);
// 我们先把数组的大小初始化成 list 的大小
SortDTO[] array = new SortDTO[list.size()];
list.toArray(array);
log.info("排序之前:{}", JSON.toJSONString(array));
Arrays.sort(array, Comparator.comparing(SortDTO::getSortTarget));
log.info("排序之后:{}", JSON.toJSONString(array));
}
排序结果如下图所示:
从输出的结果中可以看到,排序之后的数组已经是有顺序的了,也可以看到 sort 方法支持两个入参:要排序的数组和外部排序器。
sort 使用了双轴快速排序算法,使得其的排序性能比较高,具体算法就不细说了。
2.2、二分查找法(Arrays.binarySearch ())
Arrays.binarySearch 方法主要用于快速从数组中查找出对应的值。其支持的入参类型非常多,如 byte、int、long 各种类型的数组。返回参数是查找到的对应数组下标的值,如果查询不到,则返回负数。我们写了一个 demo 如下:
@Data
class SortDTO {
private int sortTarget;
public SortDTO(int sortTarget) {
this.sortTarget = sortTarget;
}
public int getSortTarget() {
return sortTarget;
}
}
@Test
public void testBinarySearch(