Collections工具类需按前提条件使用:排序要求元素可比或传Comparator,二分查找须已排序且规则一致,同步包装仅保障单操作线程安全,复合操作仍需额外同步,其他方法如replaceAll、frequency等各具适用场景。

Collections 工具类是 Java 集合操作的“瑞士军刀”,但不是所有方法都能随便用。核心在于理解每种操作的前提条件和适用边界——比如排序要求元素可比,二分查找依赖已排序前提,同步包装不等于绝对线程安全。
排序操作:自然顺序与自定义逻辑并存
sort 方法最常用,但也最容易出错。它只支持 List,且必须满足可比较性:
- 使用 Collections.sort(list) 时,list 中每个元素必须实现 Comparable 接口(如 String、Integer),否则运行时报 ClassCastException
- 若元素无法修改(如第三方类)或需多维度排序,改用 Collections.sort(list, comparator),传入 Lambda 或匿名 Comparator,例如按 User 的 score 降序:
(u1, u2) -> Integer.compare(u2.getScore(), u1.getScore()) - reverse、shuffle、swap、rotate 等辅助方法无类型限制,可直接用于任意 List,但注意 shuffle 依赖默认随机源,如需可重现结果,应传入指定 Random 实例
搜索与查找:二分查找有硬性前提
binarySearch 效率高(O(log n)),但极易误用:
- 调用前必须确保 list 已按相同规则排序——用自然顺序排的,就只能用自然顺序 binarySearch;用 Comparator 排的,binarySearch 也必须传同一个 Comparator
- 返回值不是简单的 true/false:找到时返回索引;未找到时返回 -(插入点) - 1,可用于定位插入位置。例如返回 -4,说明应在索引 3 处插入以维持顺序
- max/min 方法同样依赖可比性,若集合为空会抛 NoSuchElementException,建议先判空或配合 Optional 使用
同步控制:包装≠万能,复合操作仍需额外保护
synchronizedList、synchronizedMap 等方法只是给原有集合加了一层 synchronized 包装:
立即学习“Java免费学习笔记(深入)”;
- 单个操作(如 get、put、add)是线程安全的,但多个操作组合(如“检查是否存在再添加”)仍是竞态点,需在外层加 synchronized 块或改用 ConcurrentHashMap / CopyOnWriteArrayList
- 迭代时必须手动同步,否则可能抛 ConcurrentModificationException。正确写法:
synchronized (syncList) { for (E e : syncList) {...} } - 若只需读多写少场景,优先考虑不可变集合(Collections.unmodifiableList)或 JDK9+ 的 List.of(),比同步更轻量且更安全
其他高频实用方法
除了主干功能,这些方法常被忽略却很实用:
- replaceAll:批量替换值,比遍历更简洁,返回 boolean 表示是否发生替换
- frequency:统计某元素在集合中出现次数,适合做简单频次分析
- emptyList/emptySet/emptyMap:返回不可变空集合,比 new ArrayList() 更省内存且线程安全,推荐作为方法默认返回值
- indexOfSubList / lastIndexOfSubList:在列表中查找子列表首次/末次出现位置,适用于序列匹配场景

















