JavaSE拓展:Arrays和Collections工具类

  • 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:

  1. 接收可变参数,只适合引用类型;
  2. 返回集合长度固定,不能增删;
  3. 如果想要可修改 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

四、面试简答背诵

  1. Arrays 和 Collections 是什么?

都是工具类,构造私有,方法全部 static;Arrays 用于操作数组,Collections 用于操作 Collection 集合。

  1. Arrays.binarySearch 使用前提?

数组必须预先升序排序,找不到返回负数。

  1. Arrays.asList 的坑?

返回的 List 长度固定,不能 add/remove;传入基本类型数组会把数组整体作为一个元素;推荐传入包装类型。

  1. Collections.shuffle 作用?

随机打乱 List 集合元素顺序,只对 List 有效,Set 无序不能用。

  1. 两种排序:
  • Collections.sort(list):元素实现 Comparable 接口,自然排序
  • Collections.sort(list,Comparator):传入比较器,自定义规则,不用修改实体类

五、易错

  1. Collections.sort(new HashSet<>()); 编译不报错,但运行无效,sort 只接收 List ✔
  2. Arrays.sort 可以排序数组;Collections.sort 只能排 List 集合✔
  3. Collections.addAll 可以批量添加多个元素到集合,参数是可变参数✔

补充:Comparable 和 Comparator 简单区分(配套考点)

  1. Comparable(自然排序):实体类实现接口,重写 compareTo 方法,写在实体类内部
  2. Comparator(比较器):外部传入,不修改实体类代码,写 sort 第二个参数
java 复制代码
//Comparator匿名内部类
Collections.sort(list,new Comparator<Student>(){
    @Override
    public int compare(Student s1,Student s2){
        return s1.getId()-s2.getId();
    }
});
相关推荐
菜鸟~noob2332 小时前
【电子战】 第22篇:误差椭圆与置信区间【含matlab代码】
开发语言·算法·matlab
一个有温度的技术博主2 小时前
凌晨三点的消息堆积:当 MQ 变成“停车场“
java·后端·场景
老王爱玩车2 小时前
自定义类型:结构体
c语言·开发语言·学习
潼心1412o2 小时前
C++初阶(长期更新)第5讲:类和对象(中)
开发语言·c++
weixin_307779132 小时前
C++代码实现MATLAB中的normalize函数功能
开发语言·c++·算法·matlab
谢亮_vipxieliang2 小时前
Go WaitGroup与Once——并发同步的基石
开发语言·后端·golang
不会就选b2 小时前
算法日常・每日刷题--<动态规划>11
算法
(Charon)2 小时前
【C++面试】手写String类:同时实现拷贝构造与移动构造
c++·算法
程序员老陆2 小时前
通过std::unique_ptr初始化std::shared_ptr
开发语言·c++