Collections工具类核心在于理解前提与边界:sort要求元素实现Comparable或传Comparator,否则抛ClassCastException;binarySearch须在已排序List上调用;max/min需判空防NoSuchElementException;unmodifiableList返回只读视图而非副本;addAll、emptyList等可大幅减少样板代码。

用对 Collections 工具类,集合操作能少写一半循环、避免常见陷阱,关键不在“会不会调用”,而在“懂不懂前提和边界”。
排序别只认 sort,先看清元素能不能比
自然排序(Collections.sort(list))要求元素实现 Comparable,String、Integer 没问题,但自定义类如 User 默认不行——直接抛 ClassCastException。解决方式只有两种:
- 让类实现 Comparable 并重写 compareTo,适合固定排序逻辑
- 传入 Comparator,比如按姓名长度降序:Collections.sort(list, (a, b) -> b.name.length() - a.name.length())
注意:所有排序、reverse、shuffle、swap 都只支持 List,对 Set 或 Map 调用会编译报错;且全部是原地修改,不返回新列表。
查找和极值不是万能的,状态不对结果就废
binarySearch 必须在已升序排序的 List 上调用,未排序时返回值无意义,不是慢,而是错。max/min 看似简单,但空集合会直接抛 NoSuchElementException,务必先判空:
立即学习“Java免费学习笔记(深入)”;
- 错误写法:Collections.max(list)
- 安全写法:list.isEmpty() ? null : Collections.max(list)
frequency 内部是遍历计数,大数据量 List 中频繁调用会影响性能,可考虑用 Map 统计一次复用。
不可变和线程安全不是“一包就灵”
unmodifiableList 返回的是原始 List 的只读包装视图,add/remove 立即抛 UnsupportedOperationException,适合 API 返回或配置透出;但它不阻止你通过原始引用修改底层数据。
synchronizedList 让单个 add/get 等操作线程安全,但像“检查是否存在再添加”这类复合操作仍需外部同步块:
- 不能只靠 Collections.synchronizedList(list)
- 必须配合 synchronized(list) { if (!list.contains(x)) list.add(x); }
空集合优先用 Collections.emptyList(),复用单例,比 new ArrayList() 更省内存。
初始化和批量操作,一行顶十行
创建常用集合不必手写 new:
- 空集合:Collections.emptyList()、Collections.emptyMap()
- 单元素:Collections.singletonList("ok")
- 批量添加:Collections.addAll(list, "a", "b", "c"),比循环 add 简洁且高效
- 统一填充:Collections.fill(list, 0),适合重置数值型列表
JDK 9+ 新项目推荐用 List.of()、Set.of() 替代,语法更短、默认不可变、类型推导更强。


















