Collections是Java中用于操作集合的静态工具类,提供排序、同步包装、不可变视图、常量集合创建、频率统计等接口未定义的功能;其方法如Collections.sort()、synchronizedList()、unmodifiableList()等不可实例化调用,且返回集合多数不支持结构性修改。

Java中Collections工具类的核心用途
Collections不是集合实现类,而是专门操作集合的静态工具类。它不提供新数据结构,只封装常见算法:排序、查找、同步包装、不可变视图等。所有方法都以Collections开头调用,比如Collections.sort(),不能实例化。
哪些操作必须用Collections而不是直接调用List方法
以下功能没有对应接口方法,只能靠Collections提供:
-
Collections.synchronizedList():把普通ArrayList转为线程安全版本(注意:仅单个操作原子,复合操作仍需手动同步) -
Collections.unmodifiableList():返回不可修改视图,底层仍是原集合,修改原集合会反映到该视图中 -
Collections.emptySet()、Collections.singletonList()等:创建轻量级常量集合,比new HashSet()更省内存且线程安全 -
Collections.frequency()和Collections.disjoint():统计重复元素、判断两个集合是否无交集——这些逻辑自己写容易漏边界
Collections.sort()与List.sort()的区别和选型
两者都能排序,但行为不同:
-
Collections.sort(list):要求list必须是RandomAccess子类(如ArrayList),否则性能差;内部调用Arrays.sort() -
list.sort(comparator):是List接口默认方法,对LinkedList也适用,内部按实际类型选择策略(例如LinkedList会转数组再排) - 若集合可能为
null,Collections.sort(null)抛NullPointerException,而list.sort()在list为null时直接NPE,无差别
Listnames = Arrays.asList("z", "a", "m"); Collections.sort(names); // OK names.sort(String::compareTo); // 同样OK,但语义更贴近对象行为
容易被忽略的陷阱:unmodifiableXXX返回的是“视图”而非副本
这是最常引发线上Bug的地方。调用Collections.unmodifiableList(list)后,如果原始list后续被修改,不可修改视图会立即抛UnsupportedOperationException——但前提是访问到了已变更的部分。更危险的是:如果原始集合本身是只读的(比如由Collections.emptyList()创建),那这个“不可修改视图”其实毫无意义。
立即学习“Java免费学习笔记(深入)”;
- 真正想冻结数据,请用
List.copyOf(list)(Java 10+)或new ArrayList(list)先复制 -
Collections.checkedList()这类运行时类型检查包装器,只在添加时校验,get()不校验,别误以为能防住所有非法操作 - 所有
Collections.xxx()返回的集合都不支持remove()、add()等结构性修改,但clear()在某些实现里可能静默失败而非报错
Collections.unmodifiableXXX,得确认源头是否可控、是否已隔离可变性。










