
Java 集合工具类--Arrays和Collections
发布日期:2025-04-01 08:06:52
浏览次数:11
分类:精选文章
本文共 6224 字,大约阅读时间需要 20 分钟。
Java.util.Arrays 类与 Java.util.Collections 类
一、Java.util.Arrays 类
Arrays 类是 JDK 提供的一个工具类,用来处理数组的各种方法。该类提供了许多操作数组的静态方法,如排序、搜索、拷贝等。Arrays 类还提供了将数组转换为集合的方法,适用于对象类型数组。
1. Array 与 Arrays 的区别
- Array 类 提供了作为 Object 的静态方法,用于动态地创建和访问 Java 数组。
- Arrays 类 提供了直接对数组进行操作的方法,如排序、搜索、拷贝等。Arrays 还可以将数组转换为 List 素型。
2. Arrays 类的常用方法
1. 将数组转换为集合
Arrays.asList() 方法可以将数组转换为 List。但注意:该方法不适用于基本数据类型数组(如 byte、short、int 等),适用于对象类型数组。
代码示例:
int[] ints = {1, 2, 3};List
list = Arrays.asList(ints);System.out.println("长度:" + list.size() + ";元素:" + list); // 长度:1; 元素:[[I@1c20c684]Integer[] ints2 = {1, 2, 3, 4, 5};List list2 = Arrays.asList(ints2);System.out.println("长度:" + list2.size() + ";元素:" + list2); // 长度:5; 元素:[1, 2, 3, 4, 5] 注意:尽量避免将基本数据类型数组转换为 List,否则可能会导致问题。
Arrays.asList() 方法创建的 List 实际上与原数组共享引用,修改一个会导致另一个也随之改变。
2. 复制数组
- Arrays.copyOf() 方法可以复制数组,指定长度或范围。
- 代码示例:
String[] arr = {"a", "java", "array"};String[] arr1 = Arrays.copyOf(arr, 2); // [a, java]String[] arr2 = Arrays.copyOf(arr, 5); // [a, java, array, b, null]
- Arrays.copyOfRange() 方法可以复制数组的指定范围。
String[] arr3 = Arrays.copyOfRange(arr, 1, 3); // [java, array]String[] arr4 = Arrays.copyOfRange(arr, 2, 5); // [array, b, null]
3. 判断数组是否相等
- Arrays.equals() 方法用于判断两个数组是否相等。基本数据类型数组通过比较各元素的值;对象类型数组通过调用元素的 equals() 方法。
- 代码示例:
Integer[] data1 = {1, 2, 3};Integer[] data2 = {1, 3, 2};System.out.println(Arrays.equals(data1, data2)); // false
- Arrays.deepEquals() 方法用于判断多维数组是否相等。
Integer[][] data3 = {{1, 2, 3}, {1, 2, 3}};Integer[][] data4 = {{1, 2, 3}, {1, 2, 3}};System.out.println(Arrays.deepEquals(data3, data4)); // true
4. 获取数组的哈希值
- Arrays.hashCode() 方法返回指定数组的哈希值。
- Arrays.deepHashCode() 方法返回多维数组的深度哈希值。
- 代码示例:
Integer[] data1 = {1, 2, 3};Integer[][] data2 = {{1, 2, 3}, {1, 2, 3}};System.out.println(Arrays.hashCode(data1)); // 30817System.out.println(Arrays.deepHashCode(data2)); // 987105
5. 获取数组元素的字符串形式
- Arrays.toString() 方法返回数组的字符串表示。
- Arrays.deepToString() 方法返回多维数组的深度字符串表示。
- 代码示例:
Integer[] data1 = {1, 2, 3};Integer[][] data2 = {{1, 2, 3}, {1, 2, 3}};System.out.println(Arrays.toString(data1)); // [1, 2, 3]System.out.println(Arrays.deepToString(data2)); // [[1, 2, 3], [1, 2, 3]]
6. 数组的排序
- Arrays.sort() 方法用于对数组进行排序。
- Arrays.sort() 方法内部调用了 DualPivotQuicksort 算法(快速排序)。
- 代码示例:
int[] arr = {19, 2, 203, 4, 2, 1};Arrays.sort(arr); // [1, 2, 2, 4, 19, 203]
- 对于不实现 Comparable 接口的对象数组,可以使用自定义 Comparator 进行排序。
- 代码示例:
User user1 = new User("admin", "admin123", 19);User user2 = new User("ls", "ls123", 15);User user3 = new User("ww", "ww123", 18);User[] array = {user1, user2, user3};Arrays.sort(array, new Comparator
() { @Override public int compare(User o1, User o2) { return -Integer.compare(o1.getAge(), o2.getAge()); }});System.out.println(Arrays.toString(array)); // [User@19, User@15, User@18]
7. 二分法查找
- Arrays.binarySearch() 方法用于在排序后的数组中进行二分查找。
- 代码示例:
int[] arr = {19, 2, 203, 4, 2, 1};Arrays.sort(arr); // [1, 2, 2, 4, 19, 203]System.out.println(Arrays.binarySearch(arr, 1)); // 0System.out.println(Arrays.binarySearch(arr, 2)); // 2
8. 填充数组元素
- Arrays.fill() 方法用于将数组中的指定范围内的元素设置为某个值。
- 代码示例:
int[] arr = {19, 2, 203, 4, 2, 1};Arrays.fill(arr, 17); // [17, 17, 17, 17, 17, 17]Arrays.fill(arr, 2, 4, "java"); // [17, 17, "java", "java", 17]
3. JDK 8 及 Latter 方法
- Arrays.setAll() 方法用于将数组中的所有元素设置为生成器函数返回的值。
- Arrays.parallelSetAll() 方法用于并行处理数组中的元素设置。
- Arrays.parallelPrefix() 方法用于并行计算数组中元素的前缀值。
- Arrays.stream() 方法可以将数组转换为流(Stream),支持使用 Stream 相关的方法进行操作。
- 代码示例:
Integer[] data = {1, 2, 3, 4};Arrays.setAll(data, i -> data[i] * 2);System.out.println(Arrays.toString(data)); // [2, 4, 6, 8]Integer[] data2 = {1, 2, 3, 4};Arrays.parallelSetAll(data2, i -> data2[i] * 2);System.out.println(Arrays.toString(data2)); // [2, 4, 6, 8]Integer[] data3 = {2, 3, 4, 5};Arrays.parallelPrefix(data3, (x, y) -> x * y);System.out.println(Arrays.toString(data3)); // [2, 6, 24, 120]Integer[] data4 = {2, 3, 4, 5, 6};Arrays.parallelPrefix(data4, 1, data4.length - 1, (x, y) -> x * y);System.out.println(Arrays.toString(data4)); // [2, 3, 12, 60, 6]Integer[] data5 = {1, 2, 3, 4};List
list = Arrays.stream(data5).collect(Collectors.toList());System.out.println(list); // [1, 2, 3, 4]
二、Java.util.Collections 类
Collections 类是 Java 集合框架中的一个工具类,提供了许多对集合操作的静态方法,涵盖了集合的排序、查找、替换、同步控制等功能。
1. Collection 与 Collections 的区别
- Collection 是集合类的上级接口,继承了 List、Set 等子接口。
- Collections 是一个工具类,提供了许多操作集合的静态方法,如排序、查找、替换等。
2. Collections 类的常用方法
1. 排序操作
- Collections.sort() 方法用于对集合进行排序。默认排序方式是按元素的 natural order。
- 代码示例:
List
list = Arrays.asList("one two three four five six siven".split(" "));Collections.sort(list);System.out.println(list.toString()); // [five, four, one, siven, six, three, two]Collections.reverse(list);System.out.println(list.toString()); // [two, three, six, siven, one, four, five]
2. 查找与替换操作
- Collections.binarySearch() 方法用于查找集合中的元素。
- Collections.replaceAll() 方法用于替换集合中的元素。
- 代码示例:
List
list = Arrays.asList("one two three four five six siven".split(" "));System.out.println(Collections.binarySearch(list, "sien")); // 4Collections.replaceAll(list, "sien", " replaced");System.out.println(Collections.binarySearch(list, "sien")); // -1
3. 同步控制
- Collections 提供了多个 synchronizedXxx() 方法,将集合封装为线程安全的集合。
- 代码示例:
Integer[] arr = {8, -2, 6, 5, 9, 0};Collection c = Collections.synchronizedCollection(new ArrayList<>());List list = Collections.synchronizedList(new ArrayList<>());Set set = Collections.synchronizedSet(new HashSet<>());Map map = Collections.synchronizedMap(new HashMap<>());
- 使用线程安全集合时,必须在方法上加 synchronized 必须。
synchronized(list) { // 进行操作}
4. 其他方法
Collections.emptyList() 方法返回不可变的空列表。
Collections.emptySet() 返回不可变的空集合。
代码示例:
List list1 = Collections.EMPTY_LIST;List list2 = Collections.emptyList();System.out.println(list1 == null); // false
Collections.unmodifiableCollection() 方法返回一个不可变的集合。
代码示例:
List
list = Arrays.asList("one two three four five six sien".split(" "));List unmodifiableList = Collections.unmodifiableList(list);unmodifiableList.add("new element");System.out.println(unmodifiableList.size()); // 7
三、总结
通过以上方法,可以对 Java 中的 Arrays 和 Collections 类有深入的理解。Arrays 类提供了丰富的数组操作方法,而 Collections 类则为集合操作提供了许多便利工具。这些工具类在 Java 开发中具有重要的实用价值。
发表评论
最新留言
很好
[***.229.124.182]2025年04月20日 21时20分32秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
064:vue+openlayers根据坐标来显示点、线段、圆形、多边形
2025-03-30
(ios实战)单个ViewControl适配不同ios版本xib文件实现
2025-03-30
(Leetcode-字符串-2) 字符串运算
2025-03-30
047:cesium加载geojson文件,显示图形
2025-03-30
(type interface {}) to type string
2025-03-30
(五)java多线程之Lock类
2025-03-30
(从进程/线程视角看内存)鸿蒙内核源码分析
2025-03-30
(十一) 构建dubbo分布式平台-dubbo简介
2025-03-30
asp.net MVC 强类型视图表单Ajax提交的注意事项
2025-03-30
Bailey Button Botas Ugg Baratas Corto Botas 5803 Casta?a Holgura Outlet GUANGXI SEDA ESTANCIA CALLB
2025-03-31
canvas设置文字阴影
2025-03-31
Centos 5.3 ADSL拨号组建中小型企业网络
2025-03-31
Centos 5.8 安装后不能使用ifconfig
2025-03-31
Centos 6 & 7 LVM 逻辑盘卷管理
2025-03-31