Collection是集合顶层接口,定义增删查遍历等行为;Collections是工具类,提供操作集合的静态方法。二者拼写相近但类型不同:前者为interface,后者为final class。

Collection 是接口,不是类
它定义了集合该“能干什么”,比如 add()、remove()、contains()、iterator() 这些方法——所有真正存数据的集合(如 ArrayList、HashSet、LinkedList)都得实现它。你不能写 new Collection(),编译直接报错:Collection is abstract; cannot be instantiated。
- 它是集合框架的顶层接口,
List、Set、Queue都是它的子接口 - 它不关心具体怎么存,只约定“必须支持增删查遍历”这些行为
- 别把它和
Map混:Map不继承Collection,它自成体系
Collections 是工具类,全是静态方法
它不存数据,也不被继承,就一个纯工具箱,所有方法都是 static,直接用类名调:Collections.sort(list)。它不提供新集合类型,而是帮你“操作已有集合”或“包装出特殊行为”。
-
Collections.sort()只接受List,传Set或Queue会编译失败(类型不匹配) -
Collections.synchronizedList()返回的是装饰器对象,不是新ArrayList,底层仍用原 list 存储 -
Collections.unmodifiableList()返回的 list 一旦调add()就抛UnsupportedOperationException,不是“防误操作”,而是“立刻暴露错误”
名字差一个 s,但根本不在同一维度
就像 String 和 StringUtils 的关系:Collection 是“集合这个概念本身”,Collections 是“怎么摆弄集合”的说明书。它们既不是父子类,也不互相依赖——你可以完全不用 Collections 写业务逻辑,但只要用了 ArrayList,你就已经在用 Collection 接口了(因为 ArrayList implements List extends Collection)。
- 拼写上:单数
Collection→ 接口;复数Collections→ 工具类(这是 Java 官方命名惯例) - 导入时别手滑:
import java.util.Collection;和import java.util.Collections;是两个完全不同的东西 - IDE 自动补全常把两者列在一起,容易选错——看后缀是
interface还是class最准
常见踩坑场景
最典型的混淆是以为 Collections 能“创建集合”,结果写出这种代码:
立即学习“Java免费学习笔记(深入)”;
Collectionc = Collections.emptyList(); // ✅ 返回的是 Collection 实例(其实是空的不可变 List) List l = Collections.emptyList(); // ✅ 编译通过(多态赋值) Set s = Collections.emptySet(); // ✅ 同理 Collection bad = new Collections(); // ❌ 编译错误:Collections 是 final 类,无 public 构造器
-
Collections.emptyXXX()系列返回的是轻量级单例,不是每次 new,适合做默认值或占位符 - 想排序却传了
HashSet给Collections.sort()?不行——它只认List,Set得先转成ArrayList再排 -
Collections.max()要求元素实现Comparable,否则运行时报ClassCastException,不是编译错,容易漏测
Collection 当容器用,也别指望 Collections 存数据——一个定契约,一个给扳手,各干各的活。真正在代码里频繁出现的,其实是它的实现类(ArrayList、HashMap),而不是这两个名字。










