直接用 collections.unmodifiablelist() 仅保证引用不可变,需先复制再封装;sort() 与 binarysearch() 必须用相同 comparator 或均依赖 comparable;emptylist() 等返回轻量单例视图;synchronizedlist() 不防迭代并发修改。

怎么快速把数组转成不可修改的List
直接用 Collections.unmodifiableList() 包一层,但注意它只保护“引用不变”,不保护元素内部状态。常见错误是传入一个可变的 ArrayList,然后误以为整个结构安全了——其实只要原列表还被持有,就能改内容。
正确做法是先复制再封装:
String[] arr = {"a", "b", "c"};
List<String> safeList = Collections.unmodifiableList(new ArrayList<>(Arrays.asList(arr)));
-
Arrays.asList()返回的是固定大小的 List,不支持add()/remove(),但支持set() -
unmodifiableList()会拦截所有结构性修改操作,触发UnsupportedOperationException - 如果原始集合后续还会被其他代码修改,必须做深拷贝(比如元素是可变对象时)
sort() 和 binarySearch() 配合使用的前提是什么
Collections.sort() 和 Collections.binarySearch() 必须作用于同一份数据,且排序依据要一致。最常踩的坑是:对 List 排了序,却用没实现 Comparable 的自定义类,或传了不匹配的 Comparator。
示例中漏掉 Comparator 参数会导致运行时异常:
立即学习“Java免费学习笔记(深入)”;
List<Person> list = ...; Collections.sort(list, Comparator.comparing(p -> p.age)); // 正确 int pos = Collections.binarySearch(list, target, Comparator.comparing(p -> p.age)); // 必须传同一个 Comparator
- 若元素类型实现了
Comparable,两个方法都可不传Comparator - 否则必须显式传入完全相同的
Comparator实例,用 lambda 重写也得保证逻辑一致 -
binarySearch()在未排序 List 上调用,结果无意义
为什么 emptyList() / singletonList() 返回的是特殊实现类
Collections.emptyList() 和 Collections.singletonList() 不返回 new ArrayList() 这类常规实例,而是返回私有静态内部类(如 EmptyList、SingletonList),核心原因是节省内存和避免无谓对象创建。
- 它们是 immutable 且线程安全的,不需要同步开销
- 返回的 List 不支持
add()、clear()等操作,调用即抛UnsupportedOperationException - 比起每次都 new 一个空 ArrayList,复用单例对象更轻量;尤其在工具方法返回默认值时很常见
- 注意不要把它当容器去反复 add —— 它根本不是为写设计的
synchronizedList() 能不能解决并发修改问题
能加锁,但不能自动规避 ConcurrentModificationException。它的同步只覆盖单个方法调用(如一次 get() 或一次 add()),不覆盖迭代过程。多线程遍历时仍可能出错。
List<String> syncList = Collections.synchronizedList(new ArrayList<>());
// 下面这段代码在多线程下依然可能抛 ConcurrentModificationException
for (String s : syncList) { ... } // 迭代器本身没被同步
- 必须手动同步迭代块:
synchronized(syncList) { for (...) {...} } - 真正需要高并发读写时,优先考虑
CopyOnWriteArrayList或ConcurrentHashMap的键列表视图 -
synchronizedList()适合低并发、简单互斥场景,别指望它替代并发集合
emptyList、singletonList、unmodifiableList)返回的都是“视图”或“代理”,不是新容器;它们和原始集合共享底层数据,除非明确做了拷贝。










