写在前面:
视频是什么东西,有看文档精彩吗?
视频是什么东西,有看文档速度快吗?
视频是什么东西,有看文档效率高吗?
诸小亮:集合框架还有最后一点儿内容——工具类的使用
张小飞:工具类?做什么的?
诸小亮:当然是用于操作集合的,其中里面有一些非常好用的方法
张小飞:是吗?那赶紧说说吧
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);
}
结果:
张小飞:如果 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);
}
}
}
结果:
张小飞:可以自定义比较器吗?
诸小亮:嗯,这个也是允许的,sort 有一个重载的方法,可以传一个自定义比较器
结果:
reverse
reverse(list):逆转列表中的元素顺序
结果:
shuffle
shuffle(list):打乱列表中元素的顺序,每次执行结果都不同,棋牌类游戏经常使用
结果:
swap
swap:交换列表中指定位置的元素
结果:
copy
copy(list1,list2):复制 list2 中的元素到 list1
结果:
从结果中可以发现,daji 把 yase 给覆盖了
min
min():获取集合中的最小值
结果:
max
max():获取集合中的最大值
演示:省略
binarySearch
binarySearch:根据二分查找算法,查找 list 中的数据,返回其下标
注意:list 需要排好序
结果:
列表和数组
列表和数组互相转换
张小飞:列表和数组还可以互相转换吗?
诸小亮:是的,这也是在工作中比较常见的需求
数组转列表
诸小亮:Arrays是一个操作数组的工具类,里面有一个 asList()方法,可以把数组转换为列表
public static void main(String[] args) {
Integer[] arr = {1,2,3};
//数组转换为列表
List<Integer> list = Arrays.asList(arr);
System.out.println(list);
}
张小飞:嗯嗯,知道了
诸小亮:但是,只能转为对象类型的数组,如果是基本类型的数组,会把整个数组当成一个元素放到 List 中
比如:
上图中,arr只是列表中的一个元素
张小飞:好的,我记下了
诸小亮:其实,也有一些缺点,转换后的 list 不能修改
张小飞:您的意思是——不能执行 remove、add、clear 这些方法了?
诸小亮:是的,否则会报错,比如:
结果:
张小飞:原来如此
诸小亮:但是可以修改数组中的内容,比如:
结果:
列表转数组
张小飞:既然如此,列表是不是也能转换为数组?
诸小亮:没错,List 中有一个 toArray 方法,用于把集合转换为数组,比如:
张小飞:原来是转换成了 Object 啊,不过,list中存储的是 Integer 啊
诸小亮:像转换成 Integer 数组也是可以的,比如:
结果:
诸小亮:但是需要注意——如果 toArray 中传入的数组长度 < 集合长度,会返回一个新的数组
结果:
Arrays 中的常用方法
张小飞:Arrays 这个类中都有哪些方法呢?
诸小亮:也不少呢
fill
fill():使用指定值,填充整个数组,用于初始化默认值,看下图
结果:
该放法重载形式很多,支持所有基本类型
copyOf
copyOf:将指定数组中的元素复制到新的数组中,可以指定新的数组长度,看下图
结果:
如果新数组的长度 > 老的数组,其他元素都是默认值,比如:
结果:,最后两个 0 是默认值
也可以将指定范围的元素复制到新数组中,看下图
结果:,注意:包含头,不包含尾
equals
equals:判断两个数组中的数据是否相同,看下图
结果:
sort
sort:对数组进行升序排序,看下图
结果:
binarySearch
binarySearch:使用二分查找算法在数组中寻找元素,返回下标,不存在返回负数,但数组需要排好序
结果:
可变参数
张小飞:什么是可变参数?
诸小亮:可变参数——就是参数的类型一样,但是数量不定,其本质就是一个数组
张小飞:数组?
诸小亮:给你看个例子就明白了,写一个方法计算 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;
}
张小飞:原来这就是可变参数
诸小亮:需要注意——可变参数必须放到,参数列表的最后面,比如:
修改后: