Arrays、Collections、Objects 常用方法源码解析

本文深入解析Java中的Arrays、Collections、Objects三个常用工具类的源码,包括Arrays的排序、二分查找、拷贝,Collections的最大值、最小值获取,以及Objects的相等和为空判断。通过源码分析,理解这些方法的实现原理和使用技巧。
摘要由CSDN通过智能技术生成

Arrays、Collections、Objects 常用方法源码解析

我们在工作中都会写工具类,但如何才能使写出来的工具类更好用,也是有一些技巧的。现在我们以三种平时工作中经常使用的工具类为例,从使用案例出发,再看看底层源码的实现,看看能否学习到一些工具类的技巧,以及三种工具类的实际使用场景。

一:工具类的通用特征

一般一个工具类一般有一下几个特点:

  1. 构造器必须是私有的。这样的话,工具类就无法被 new 出来,因为工具类在使用的时候,无需初始化,直接使用即可,所以不会开放出构造器出来;
  2. 具类的工具方法必须被 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(
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值