在Java里Collections类提供了哪些功能_Java集合工具类说明

不能直接

new Collections(),因其构造函数为 private;常用不可变集合创建方法有 Java 9 的 List.of()、Set.of()、Map.of() 和早期的 Collections.unmodifiableXXX();排序和查找要求元素实现 Comparable 或传入 Comparator,且 binarySearch() 前提是列表已排序;同步包装器仅保证单操作原子性,现代推荐使用 ConcurrentHashMap 等并发集合。

为什么不能直接 new Collections()?

Collections 是一个纯工具类,所有方法都是 static,构造函数被显式声明为 private。试图 new Collections() 会编译报错:Constructor Collections() is not visible。它不封装状态,只提供对 Collection 实例的操作入口。

常用不可变集合创建方法有哪些?

Java 9 引入了 List.of()Set.of()Map.of() 等静态工厂方法,它们返回的是轻量、不可修改、线程安全的集合实例。而 Collections.unmodifiableXXX()(如 Collections.unmodifiableList())是更早的兼容方案,底层包装原集合并拦截所有修改操作,调用 add()clear() 等会抛出 UnsupportedOperationException

注意:unmodifiableXXX() 返回的仍是原集合类型(比如 ArrayList 的包装),不是新实现;而 List.of() 返回的是私有不可变实现,内存更紧凑。

List mutable = new ArrayList<>(Arrays.asList("a", "b"));
List unmod = Collections.unmodifiableList(mutable);
unmod.add("c"); // 抛出 UnsupportedOperationException

排序和查找必须满足什么前提?

Collections.sort()Collections.binarySearch() 要求元素实现 Comparable 接口,或传入显式的 Comparator。否则运行时抛出 ClassCastException 或逻辑错误(比如 binarySearch() 返回负数但不是插入点)。

  • sort() 只支持 List,不支持 SetQueue
  • binarySearch() 前提是列表已按同一规则排好序,否则结果无意义
  • null 元素要格外小心:默认 Comparable 实现通常不支持 null,需自定义 Comparator 显式处理

同步包装器现在还推荐用吗?

Collections.synchronizedList()synchronizedMap() 等返回的是加了 synchronized 方法锁的包装类,但它们**只保证单个操作原子性**。像遍历 + 修改组合操作(例如“检查是否存在再添加”)仍需手动同步外部代码块,否则可能出错。

现代 Java 更倾向使用并发集合:ConcurrentHashMapCopyOnWriteArrayListBlockingQueue 实现。它们在设计上支持高并发场景,粒度更细,性能更好。

容易忽略的一点:synchronizedXXX() 包装后的集合,其迭代器仍不是线程安全的,遍历时必须手动同步整个迭代过程。