【从零开始学Java | 第二十九篇】数组工具类Arrays和集合工具类Collections

张开发
2026/4/6 17:04:58 15 分钟阅读

分享文章

【从零开始学Java | 第二十九篇】数组工具类Arrays和集合工具类Collections
目录前言一、数组工具类Arrays1.数组的打印2.数组的排序和查找3.数组的复制和扩容4.数组转换集合二、集合工具类Collections1.排序和位置操作2.查找和极值运算前言本次学习两个Java提供的工具类第一个是用来操作数组的工具类——Arrays第二个是用来操作集合的工具类——Collections。Collections要与Collection区分开来一个是Java提供的用来操作集合的工具类另一个则是List、Set等的顶层接口提供了对集合的基础操作。一、数组工具类Arrays1.数组的打印当我们使用System.out.println(arr)数组时控制台只会输出一个地址值而Arrays提供了一个方法能够不需要遍历直接打印数组。toString(数据类型[] a)将一维数组的内容拼接成一个带中括号和逗号的字符串。deepToString(Object[] a)专门用于打印多维数组。如果是二维数组用普通的toString依然会打印出内存地址必须用deepToString。int[] arr {1, 3, 4, 5, 6, 7}; System.out.println(Arrays.toString(arr)); //输出[1, 3, 4, 5, 6, 7] int[][] matrix {{1, 2}, {3, 4}}; System.out.println(Arrays.deepToString(matrix)); //输出[[1, 2], [3, 4]]2.数组的排序和查找sort(数据类型[] a):对数组进行升序排序。sort(T[] a, Comparator? super T c):传入自定义比较器进行排序注意只能用于对象数组如Integer[]不能用于int[]。binarySearch(数据类型[] a, 查找值 key):使用二分查找法在数组中寻找指定值返回对应的索引。注在使用二分查找时必须确保数组已经是升序排序状态。//二、排序、查找 int[] arr2 {5, 7, 2, 6, 9}; Arrays.sort(arr2); System.out.println(Arrays.toString(arr2)); //输出[2, 5, 6, 7, 9] Integer[] arr3 {5, 7, 2, 6, 9}; Arrays.sort(arr3, new ComparatorInteger() { Override public int compare(Integer o1, Integer o2) { return o2 - o1; } }); System.out.println(Arrays.toString(arr3)); //输出[9, 7, 6, 5, 2] System.out.println(Arrays.binarySearch(arr2, 7)); //输出33.数组的复制和扩容copyOf(数据类型[] original, int newLength)复制指定的数组并截断或用默认值如 0 或 null填充使其达到指定的newLength。copyOfRange(数据类型[] original, int from, int to)截取数组中的一部分复制成一个新数组。注意范围是包头不包尾[from, to)。int[] origin {10, 20, 30}; // 1. 扩容到长度 5 (后面自动补 0) int[] expanded Arrays.copyOf(origin, 5); System.out.println(扩容后: Arrays.toString(expanded)); // [10, 20, 30, 0, 0] // 2. 截取索引 0 到 2 (不包括 2) int[] subArr Arrays.copyOfRange(origin, 0, 2); System.out.println(截取后: Arrays.toString(subArr)); // [10, 20]4.数组转换集合asList(T...a):将一组对象或一个数组转换为List集合。注意1.不能改变长度asList返回的其实并不是我们常用的java.util.ArrayList而是Arrays内部的一个私有静态内部类。这个内部类没有重写add和remove方法。如果你对转换后的集合执行增删操作会直接抛出UnsupportedOperationException。2.如果你传入一个int[]基本类型数组asList会把整个数组当成一个单一的元素放入 List而不是把数组里的数字分别放入 List。必须使用包装类数组如Integer[]才能得到预期的效果。错误示范①错误示范②二、集合工具类Collections1.排序和位置操作sort(ListT list)对 List 中的元素进行自然排序升序。前提是 List 中的元素必须实现了Comparable接口。sort(ListT list, Comparator? super T c)根据指定的比较器Comparator进行自定义排序。reverse(List? list)反转List 中元素的顺序。shuffle(List? list)对 List 中的元素进行随机打乱。常用于抽奖、随机发牌等场景。swap(List? list, int i, int j)交换 List 中指定两个索引位置的元素。ListInteger list new ArrayList(Arrays.asList(3, 1, 4, 1, 5, 9)); // 1. 升序排序 Collections.sort(list); System.out.println(升序: list); // 输出: [1, 1, 3, 4, 5, 9] // 2. 自定义降序排序 (结合 Lambda) Collections.sort(list, (a, b) - b - a); System.out.println(降序: list); // 输出: [9, 5, 4, 3, 1, 1] // 3. 反转顺序 Collections.reverse(list); System.out.println(反转: list); // 输出: [1, 1, 3, 4, 5, 9] // 4. 随机打乱 Collections.shuffle(list); System.out.println(打乱: list); // 输出顺序随机2.查找和极值运算binarySearch(List? extends Comparable? list, T key)使用二分查找法在 List 中查找指定元素返回其索引。前提在使用binarySearch之前List 必须已经是升序排好序的如果找不到元素会返回一个负数。max(Collection? extends T coll)/min(...)根据元素的自然顺序返回集合中的最大值或最小值。frequency(Collection? c, Object o)统计某个指定元素在集合中出现的次数。replaceAll(ListT list, T oldVal, T newVal)将 List 中所有的oldVal统一替换为newVal。ListString names new ArrayList(Arrays.asList(张三, 李四, 王五, 李四)); // 统计 李四 出现的次数 int count Collections.frequency(names, 李四); System.out.println(李四出现次数: count); // 输出: 2 // 查找最大值 (按照字符串字典序) System.out.println(最大值: Collections.max(names)); // 批量替换 Collections.replaceAll(names, 李四, 赵六); System.out.println(替换后: names); // 李四全变成了赵六

更多文章