张小飞的Java之路——第三十八章——集合工具类

文章详细介绍了Java中Collections工具类的使用,包括sort排序(支持自定义比较器)、reverse逆转、shuffle打乱、swap交换、copy复制等方法,并探讨了列表与数组之间的转换。同时,提到了Arrays类中的fill、copyOf、equals、sort等方法以及可变参数的概念和应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

写在前面:

视频是什么东西,有看文档精彩吗?

视频是什么东西,有看文档速度快吗?

视频是什么东西,有看文档效率高吗?


诸小亮:集合框架还有最后一点儿内容——工具类的使用

张小飞:工具类?做什么的?

诸小亮:当然是用于操作集合的,其中里面有一些非常好用的方法

张小飞:是吗?那赶紧说说吧

Collections

诸小亮:首先看 Collections——是一个工具类,定义了一些 static 方法,用于操作集合

张小飞:都有哪些方法呢?

sort

诸小亮:第一个,sort(list)——对 list 集合的数据进行排序

public static void main(String[] args) {
    List<Integer> list = new ArrayList<>();
    list.add(5);
    list.add(4);
    list.add(2);
    list.add(9);
    //排序
    Collections.sort(list);
    System.out.println(list);
}

结果:image.png

张小飞:如果 list 中存放的是自定义对象呢?

诸小亮:那就需要实现 Comparable 接口了,比如:

class Hero implements Comparable<Hero>{
    String name;
    Hero(String name) {
        this.name = name;
    }
    @Override
    public int compareTo(Hero o) {
        return this.name.compareTo(o.name);
    }
}

public class Demo {
    public static void main(String[] args) {
        List<Hero> list = new ArrayList<>();
        list.add(new Hero("yase"));
        list.add(new Hero("anqila"));
        list.add(new Hero("libai"));
        list.add(new Hero("wangzhaojun"));
        //排序
        Collections.sort(list);
        for(Hero h : list){
            System.out.println(h.name);
        }
    }
}

结果:image.png

张小飞:可以自定义比较器吗?

诸小亮:嗯,这个也是允许的,sort 有一个重载的方法,可以传一个自定义比较器

image.png

结果:

image.png

reverse

reverse(list):逆转列表中的元素顺序

image.png

结果:

image.png

shuffle

shuffle(list):打乱列表中元素的顺序,每次执行结果都不同,棋牌类游戏经常使用

image.png

结果:

image.png

swap

swap:交换列表中指定位置的元素

image.png

结果:

image.png

copy

copy(list1,list2):复制 list2 中的元素到 list1

image.png

结果:

image.png
从结果中可以发现,daji 把 yase 给覆盖了

min

min():获取集合中的最小值

image.png

结果:image.png

max

max():获取集合中的最大值
演示:省略

binarySearch

binarySearch:根据二分查找算法,查找 list 中的数据,返回其下标
注意:list 需要排好序

image.png

结果:image.png

列表和数组

列表和数组互相转换

张小飞:列表和数组还可以互相转换吗?

诸小亮:是的,这也是在工作中比较常见的需求

数组转列表

诸小亮:Arrays是一个操作数组的工具类,里面有一个 asList()方法,可以把数组转换为列表

public static void main(String[] args) {
    Integer[] arr = {1,2,3};
    //数组转换为列表
    List<Integer> list = Arrays.asList(arr);
    System.out.println(list);
}

张小飞:嗯嗯,知道了

诸小亮:但是,只能转为对象类型的数组,如果是基本类型的数组,会把整个数组当成一个元素放到 List 中
比如:

image.png
上图中,arr只是列表中的一个元素

张小飞:好的,我记下了

诸小亮:其实,也有一些缺点,转换后的 list 不能修改

张小飞:您的意思是——不能执行 remove、add、clear 这些方法了?

诸小亮:是的,否则会报错,比如:

image.png

结果:
image.png
张小飞:原来如此

诸小亮:但是可以修改数组中的内容,比如:

image.png

结果:image.png

列表转数组

张小飞:既然如此,列表是不是也能转换为数组?

诸小亮:没错,List 中有一个 toArray 方法,用于把集合转换为数组,比如:

image.png

张小飞:原来是转换成了 Object 啊,不过,list中存储的是 Integer 啊

诸小亮:像转换成 Integer 数组也是可以的,比如:

image.png

结果:image.png

诸小亮:但是需要注意——如果 toArray 中传入的数组长度 < 集合长度,会返回一个新的数组

image.png

结果:image.png

Arrays 中的常用方法

张小飞:Arrays 这个类中都有哪些方法呢?

诸小亮:也不少呢

fill

fill():使用指定值,填充整个数组,用于初始化默认值,看下图

image.png

结果:image.png

该放法重载形式很多,支持所有基本类型

image.png

copyOf

copyOf:将指定数组中的元素复制到新的数组中,可以指定新的数组长度,看下图

image.png

结果:image.png

如果新数组的长度 > 老的数组,其他元素都是默认值,比如:

image.png

结果:image.png,最后两个 0 是默认值

也可以将指定范围的元素复制到新数组中,看下图

image.png

结果:image.png,注意:包含头,不包含尾

equals

equals:判断两个数组中的数据是否相同,看下图

image.png

结果:image.png

sort

sort:对数组进行升序排序,看下图

image.png

结果:image.png

binarySearch

binarySearch:使用二分查找算法在数组中寻找元素,返回下标,不存在返回负数,但数组需要排好序

image.png

结果:image.png

可变参数

张小飞:什么是可变参数?

诸小亮:可变参数——就是参数的类型一样,但是数量不定,其本质就是一个数组

张小飞:数组?

诸小亮:给你看个例子就明白了,写一个方法计算 int 数组中所有元素的和

张小飞:小 case,我来写

public static void main(String[] args) {
    int[] arr = {1,2,3};
    System.out.println(sum(arr));
}

public static int sum(int[] arr){
    int sum = 0;
    for(int i : arr) {
        sum += i;
    }
    return sum;
}

诸小亮:嗯嗯,不错,但是还有简写方式:可变参数,比如:

public static void main(String[] args) {
    int[] arr = {1,2,3};
    //1. 可以直接传递数组
    System.out.println(sum(arr));
    
    //2. 也可以直接传递参数
    System.out.println(sum(1,2,3));
}

//arr: 就是可变参数
public static int sum(int... arr){
    int sum = 0;
    for(int i : arr) {
        sum += i;
    }
    return sum;
}

张小飞:原来这就是可变参数

诸小亮:需要注意——可变参数必须放到,参数列表的最后面,比如:

image.png

修改后:

image.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值