在 Java 开发中,Collections
工具类是一个操作集合的强大工具。它提供了各种静态方法,用于对 Set
、List
和 Map
等集合进行操作,包括添加、排序、查询、复制等功能。本文将全面解析 Collections
工具类的核心方法,并通过代码示例展示其强大之处。
集合框架图(Collection、Map)
- Vector和ArrayList的区别
共同点:都是数组实现的
不同点:
Vector是线程安全的动态数组,数组初始化长度为 10,默认扩容为 2 倍。
ArrayList是线程不安全的动态数组,数组初始化长度为 10,默认扩容为 1.5 倍。
-HashMap与Hashtable的区别
相同点:都是哈希表实现的
不同点:
Hashtable是线程安全的,任何非 null 对象都可以用作键或值。
HashMap是线程不安全的,并允许使用 null 值和 null 键。
一、Collections 工具类简介
Collections
是一个包含静态方法的工具类,专门用于操作 Collection
类型的集合对象。其主要功能包括:
- 对集合元素进行排序、查询和修改。
- 设置集合为不可变。
- 提供线程安全的集合包装。
常见功能包括:
- 添加元素
- 查找元素
- 排序
- 反转
- 复制
- 替换
- 线程安全转换
二、核心方法解析
2.1 添加元素
方法:
public static <T> boolean addAll(Collection<? super T> c, T... elements)
将所有指定元素添加到指定 Collection
中。
示例代码:
List<Object> list = new ArrayList<>();
Collections.addAll(list, "hello", "java", 1, 2, 3);
System.out.println(list); // 输出:[hello, java, 1, 2, 3]
2.2 查找元素
- 二分查找 方法:
public static <T> int binarySearch(List<? extends Comparable<? super T>> list, T key)
在 List
中查找某个元素的下标(需排序)。
- 最大元素 方法:
public static <T extends Object & Comparable<? super T>> T max(Collection<? extends T> coll)
返回集合中的最大元素。
- 统计频率 方法:
public static int frequency(Collection<?> c, Object o)
返回指定集合中某元素的出现次数。
示例代码:
List<Integer> list = Arrays.asList(1, 2, 3, 3, 4);
System.out.println(Collections.frequency(list, 3)); // 输出:2
2.3 排序和反转
- 反转 方法:
public static void reverse(List<?> list)
反转列表中元素的顺序。
- 排序 方法:
-
根据自然顺序排序:
public static <T extends Comparable<? super T>> void sort(List<T> list)
-
根据指定比较器排序:
public static <T> void sort(List<T> list, Comparator<? super T> c)
- 随机排序 方法:
public static void shuffle(List<?> list)
将 List
集合元素进行随机排序。
示例代码:
List<Integer> list = Arrays.asList(1, 2, 3, 4);
Collections.reverse(list);
System.out.println(list); // 输出:[4, 3, 2, 1]
Collections.shuffle(list);
System.out.println(list); // 输出随机顺序
2.4 复制、替换与交换
- 复制 方法:
public static <T> void copy(List<? super T> dest, List<? extends T> src)
将 src
的内容复制到 dest
,目标列表长度必须大于或等于源列表。
- 替换 方法:
public static <T> boolean replaceAll(List<T> list, T oldVal, T newVal)
使用新值替换 List
中所有旧值。
- 交换 方法:
public static void swap(List<?> list, int i, int j)
交换指定列表中 i
和 j
位置的元素。
示例代码:
List<Integer> list = new ArrayList<>(Arrays.asList(1, 2, 3, 4));
Collections.swap(list, 0, 3);
System.out.println(list); // 输出:[4, 2, 3, 1]
2.5 线程安全转换
方法:
public static <T> Collection<T> synchronizedCollection(Collection<T> c)
public static <K, V> Map<K, V> synchronizedMap(Map<K, V> m)
将非线程安全集合包装为线程安全集合。
示例代码:
List<Integer> list = Collections.synchronizedList(new ArrayList<>());
list.add(1);
list.add(2);
System.out.println(list); // 输出:[1, 2]
三、案例展示
示例一:统计元素频率
List<String> list = Arrays.asList("apple", "banana", "apple", "orange");
System.out.println(Collections.frequency(list, "apple")); // 输出:2
示例二:排序与查找
List<Integer> list = Arrays.asList(4, 2, 5, 1);
Collections.sort(list);
System.out.println(Collections.binarySearch(list, 5)); // 输出:3
示例三:线程安全
Map<String, Integer> map = Collections.synchronizedMap(new HashMap<>());
map.put("A", 1);
map.put("B", 2);
System.out.println(map);
四、总结
Collections
工具类提供了丰富的静态方法,大大简化了对集合的操作。通过熟练掌握 Collections
工具类中的各种方法,可以提升代码质量和开发效率。无论是排序、查找,还是线程安全的集合包装,Collections
工具类都能满足开发中的各种需求。