java.util.Arrays:数组工具类,专门操作数组java.util.Collections:集合工具类,专门操作 Collection 集合(List、Set)- 两个类都是工具类 :构造方法私有,全部方法都是
static,直接类名。方法名 () 调用,不能 new 对象
一、Arrays 工具类(操作数组)
包:import java.util.Arrays;
常用 API
| 方法 | 作用 |
|---|---|
toString(数组) |
把数组转为字符串输出,打印数组内容 |
sort(数组) |
数组排序,基本类型:快速排序;对象:需要实现 Comparable 接口 |
binarySearch(数组, key) |
二分查找,数组必须提前升序排序,找到返回索引,找不到返回负数 |
copyOf(原数组,新长度) |
数组复制,截取 / 扩容数组 |
copyOfRange(arr,from,to) |
范围复制,左闭右开 [from , to) |
fill(arr,值) |
给数组全部元素填充指定值 |
asList(T... a) |
把多个对象转成 List 集合,重点坑点 |
代码示例
java
import java.util.Arrays;
public class ArraysDemo {
public static void main(String[] args) {
int[] arr = {5,2,9,1,6};
//1.toString 打印数组
System.out.println(Arrays.toString(arr)); // [5, 2, 9, 1, 6]
//2.sort 排序
Arrays.sort(arr);
System.out.println(Arrays.toString(arr)); //[1, 2, 5, 6, 9]
//3.binarySearch二分查找,数组必须排好序
int index = Arrays.binarySearch(arr,5);
System.out.println(index); //2
int index2 = Arrays.binarySearch(arr,10);
System.out.println(index2); //负数,代表不存在
//4.copyOf 复制数组
int[] newArr = Arrays.copyOf(arr, 10);
System.out.println(Arrays.toString(newArr));
//5.fill填充
int[] arr2 = new int[3];
Arrays.fill(arr2,8);
System.out.println(Arrays.toString(arr2));
}
}
⚠️重点坑:Arrays.asList ()
java
// ✅传入多个对象
List<String> list = Arrays.asList("张三","李四","王五");
// ❗坑1:返回的集合是【固定大小】,不能add、remove,会抛UnsupportedOperationException
// list.add("赵六"); //报错!
// ❗坑2:不能直接传基本类型数组,会把整个数组当做一个对象存入集合
int[] nums = {1,2,3};
List list = Arrays.asList(nums);
System.out.println(list.size()); //输出1,集合里面存的是数组对象,不是数字
//✅正确:使用包装类数组
Integer[] nums2 = {1,2,3};
List<Integer> list2 = Arrays.asList(nums2);
总结
Arrays.asList:
- 接收可变参数,只适合引用类型;
- 返回集合长度固定,不能增删;
- 如果想要可修改 List:
new ArrayList<>(Arrays.asList(元素))
二、Collections 工具类(操作 Collection 集合)
包:import java.util.Collections;
注意区别:
Collection:是父接口 ,List/Set的父接口Collections:工具类,全部静态方法,操作集合对象
常用 API
| 方法 | 作用 |
|---|---|
sort(List<T> list) |
对 List 集合排序,元素需要实现 Comparable 接口(自然排序) |
sort(List<T> list,比较器对象) |
自定义比较器 Comparator,自定义排序规则 |
shuffle(List<?> list) |
随机打乱 List 集合元素顺序,考试高频 |
reverse(List<?> list) |
反转集合顺序 |
max(Collection)、min(Collection) |
获取集合最大、最小元素 |
addAll(集合,T...元素) |
批量往集合添加多个元素,可变参数 |
swap(List<?> list,int i,int j) |
交换集合两个索引位置元素 |
synchronizedList(list) |
把普通 List 转为线程安全集合 |
代码示例
java
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
public class CollectionsDemo {
public static void main(String[] args) {
ArrayList<Integer> list = new ArrayList<>();
//批量添加元素,可变参数
Collections.addAll(list,5,1,9,3,7);
System.out.println(list);
//排序 自然排序
Collections.sort(list);
System.out.println(list);
//自定义比较器:降序
Collections.sort(list, new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
return o2 - o1;
}
});
System.out.println(list);
//打乱顺序,做题高频
Collections.shuffle(list);
System.out.println("打乱后:"+list);
//反转
Collections.reverse(list);
//最大值最小值
Integer max = Collections.max(list);
Integer min = Collections.min(list);
System.out.println("max="+max+",min="+min);
}
}
拓展:Stream 写法等价排序,但是 Collections 是传统工具方法。
三、Arrays 和 Collections 对比
| Arrays | Collections | |
|---|---|---|
| 操作目标 | 数组 | Collection 集合(List、Set) |
| 包 | java.util.Arrays | java.util.Collections |
| 特点 | 全部 static 静态方法,私有构造 | 全部 static 静态方法,私有构造 |
| 常用功能 | 排序、二分查找、复制数组、转 List | 集合排序、打乱、反转、批量添加、取最大最小 |
| 注意 | asList 返回定长集合,不能增删 | sort 只支持 List,Set 不能用 shuffle、swap |
四、面试简答背诵
- Arrays 和 Collections 是什么?
都是工具类,构造私有,方法全部 static;Arrays 用于操作数组,Collections 用于操作 Collection 集合。
- Arrays.binarySearch 使用前提?
数组必须预先升序排序,找不到返回负数。
- Arrays.asList 的坑?
返回的 List 长度固定,不能 add/remove;传入基本类型数组会把数组整体作为一个元素;推荐传入包装类型。
- Collections.shuffle 作用?
随机打乱 List 集合元素顺序,只对 List 有效,Set 无序不能用。
- 两种排序:
Collections.sort(list):元素实现 Comparable 接口,自然排序Collections.sort(list,Comparator):传入比较器,自定义规则,不用修改实体类
五、易错
Collections.sort(new HashSet<>());编译不报错,但运行无效,sort 只接收 List ✔- Arrays.sort 可以排序数组;Collections.sort 只能排 List 集合✔
- Collections.addAll 可以批量添加多个元素到集合,参数是可变参数✔
补充:Comparable 和 Comparator 简单区分(配套考点)
- Comparable(自然排序):实体类实现接口,重写 compareTo 方法,写在实体类内部
- Comparator(比较器):外部传入,不修改实体类代码,写 sort 第二个参数
java
//Comparator匿名内部类
Collections.sort(list,new Comparator<Student>(){
@Override
public int compare(Student s1,Student s2){
return s1.getId()-s2.getId();
}
});