collections是操作集合的静态工具类,提供排序、查找、统计、安全包装等方法,所有方法均通过collections.方法名()调用,不创建新集合且无需实例化。

Collections 工具类不是集合,而是专为操作集合设计的静态方法集合。它不创建新集合,也不需要实例化,所有方法都通过 Collections.方法名() 直接调用。用得好,能省去大量手动遍历、比较、包装代码;用得不当,容易引发 UnsupportedOperationException、IndexOutOfBoundsException 或线程安全问题。
排序与顺序控制:只对 List 有效,且多数直接修改原集合
排序类方法基本只支持 List,且绝大多数会改变原始列表内容,无需返回值:
-
自然排序:调用
Collections.sort(list),要求元素实现Comparable(如String、Integer); -
自定义排序:传入
Comparator,推荐用Comparator.comparing(…).reversed()或 Lambda 表达式,例如按员工薪资降序:Collections.sort(employees, Comparator.comparing(Employee::getSalary).reversed()); -
反转与打乱:
Collections.reverse(list)快速倒序;Collections.shuffle(list)基于默认随机源洗牌,适合题库抽题、抽奖逻辑; -
交换与旋转:
Collections.swap(list, i, j)安全交换两位置;Collections.rotate(list, distance)实现循环位移(正数右旋,负数左旋)。
查找与统计:注意前提条件,避免误用
这些方法看似简单,但对输入有隐含要求,忽略会导致结果错误或异常:
-
二分查找:
Collections.binarySearch(list, key)要求列表已按相同规则排序(自然序或指定Comparator),否则返回值无意义; -
极值获取:
Collections.max(collection)和min()支持任意Collection(List/Set/Queue),但元素必须可比;也可传入Comparator控制逻辑,比如找最长字符串:Collections.max(words, Comparator.comparing(String::length)); -
频次统计:
Collections.frequency(collection, obj)内部使用equals()判断相等,适用于去重前的数据分析,如统计日志中某错误码出现次数; -
填充与替换:
Collections.fill(list, obj)全量赋值,常用于重置状态;Collections.replaceAll(list, old, new)批量更新,比循环更简洁。
构建安全集合:优先选不可变,慎用同步包装
多线程或防御性编程场景下,应主动控制集合的可变性,而非依赖运行时检查:
-
不可变集合:用
Collections.unmodifiableList(list)返回只读视图,任何修改操作(add/remove/set)都会抛出异常;JDK 9+ 更推荐List.of()、Set.of(),语法更简、类型推导更强、默认不可变; -
空/单元素集合:用
Collections.emptyList()、singletonList("x")替代new ArrayList(),内存高效且线程安全; -
同步包装:
Collections.synchronizedList(new ArrayList())只保证单个操作原子性,迭代仍需手动加锁(如synchronized(list) { for(...) {...} }),生产环境建议改用CopyOnWriteArrayList或ConcurrentHashMap等真正并发安全的实现。
避坑要点:别踩常见陷阱
几个高频出错点,直接影响程序稳定性和可维护性:
-
copy 方法巨坑:
Collections.copy(dest, src)要求dest.size() ≥ src.size(),否则直接抛IndexOutOfBoundsException;日常应改用new ArrayList(src)初始化; -
泛型不能少:始终声明带泛型的集合,如
List<string></string>,避免运行时ClassCastException; -
避免链式误操作:不要对不可变集合(如
unmodifiableList)再调用sort或reverse,会立即失败; -
Comparator 空值处理:若元素可能为
null,自定义Comparator时需显式处理,或使用Comparator.nullsFirst()/nullsLast()。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











