Collection是集合顶层接口,定义增删查遍历等行为;Collections是工具类,提供操作集合的静态方法。二者拼写相近但类型不同:前者为interface,后者为final class。
它定义了集合该“能干什么”,比如 add()、remove()、contains()、iterator() 这些方法——所有真正存数据的集合(如 ArrayList、HashSet、LinkedList)都得实现它。你不能写 new Collection(),编译直接报错:Collection is abstract; cannot be instantiated。
List、Set、Queue 都是它的子接口Map 混:Map 不继承 Collection,它自成体系它不存数据,也不被继承,就一个纯工具箱,所有方法都是 static,直接用类名调:Collections.sort(list)。它不提供新集合类型,而是帮你“操作已有集合”或“包装出特殊行为”。
Collections.sort() 只接受 List,传 Set 或 Queue 会编译失败(类型不匹配)Collections.synchronizedList() 返回的是装饰器对象,不是新 ArrayList,底层仍用原 list 存储Collections.unmodifiableList() 返回的 list 一旦调 add() 就抛 UnsupportedOperationException,不是“防误操作”,而是“立刻暴露错误”就像 String 和 StringUtils 的关系:Collection 是“集合这个概念本身”,Collections 是“怎么摆弄集合”的说明书。它们既不是父子类,也不互相依赖——你可以完全不用 Collections 写业务逻辑,但只要用了 ArrayList,你就已经在用 Collection 接口了(因为 ArrayList implements List extends Collection)。
Collection → 接口;复数 Collections → 工具类(这是 Java 官方命名惯例)import java.util.Collection; 和 import java.util.Collections; 是两个完全不同的东西interface 还是 class 最准最典型的混淆是以为 Collections 能“创建集合”,结果写出这种代码:
Collectionc = Collections.emp tyList(); // ✅ 返回的是 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),而不是这两个名字。