Collection vs Collections:核心区别与面试指南
一、本质区别(核心记忆点)
维度 | Collection | Collections |
---|---|---|
身份 | 集合框架的根接口 | 操作集合的工具类 |
包位置 | java.util | java.util |
是否可实例化 | ❌ 接口 | ✅ 类(但构造器私有,不可实例化) |
用途 | 定义集合的基本行为规范 | 提供操作集合的静态工具方法 |
一句话记忆:
"Collection是规矩,Collections是工具"
二、深度解析
1. Collection(接口)
-
地位:Java集合框架的"老祖宗",所有集合类(List/Set/Queue)的父接口
核心方法:
java
boolean add(E e); // 添加元素 boolean remove(Object o); // 删除元素 int size(); // 元素数量 Iterator<E> iterator(); // 获取迭代器
常见实现类:
-
List
→ ArrayList, LinkedList -
Set
→ HashSet, TreeSet -
Queue
→ PriorityQueue
-
2. Collections(工具类)
-
设计模式:采用工具类模式(类似Arrays)
-
经典方法:
java
// 排序
static void sort(List<T> list);
// 二分查找(必须先排序!)
static int binarySearch(List<?> list, T key);
// 线程安全包装
static Collection synchronizedCollection(Collection c);
// 不可变集合
static List unmodifiableList(List<?> list);
//混排,打乱顺序:shuffle
Collections.shuffle(list);
//反转List集合中的元素
Collection.reverse(list);
//替换所有的元素
//替换所有的元素为null
Collections.fill(list,null);
三、面试高频问题
问题1:为什么Collection和Collections要分开设计?
参考答案:
"Collection作为接口定义了集合的基本契约,而Collections作为工具类提供通用算法操作。这种分离符合单一职责原则,接口负责定义行为,工具类负责提供实现,比如排序、线程安全转换等公共能力。"
问题2:Collections.sort()如何工作?
技术要点:
-
对于
List
元素实现Comparable
的情况:java
// 内部调用元素的compareTo方法 list.sort(null);
使用自定义
Comparator
:java
Collections.sort(list, (a,b) -> b - a); // 降序
底层实现:JDK7+使用TimSort(归并排序优化版)
问题3:如何创建不可变集合?
正确姿势:
java
List<String> unmodifiableList = Collections.unmodifiableList(list);
Set<String> unmodifiableSet = Collections.unmodifiableSet(set);
注意:尝试修改会抛UnsupportedOperationException
四、记忆技巧
1. 形象比喻法
-
Collection → "宪法"
(规定集合应该有哪些基本能力) -
Collections → "国务院"
(提供具体政策工具:排序、搜索、安全控制等)
2. 命名规律法
-
Collection(单数)→ 代表单个集合对象的接口
-
Collections(复数)→ 管理多个集合操作的工具类
3. 代码对照法
java
// Collection 用法(接口)
Collection<String> coll = new ArrayList<>();
coll.add("Java");
// Collections 用法(工具类)
Collections.sort((List) coll);
五、面试陷阱预警
-
Collections.synchronizedList vs Vector
-
Vector
是线程安全的古老实现(方法级同步,性能差) -
Collections.synchronizedList
是现代方案的装饰器模式
-
-
Arrays.asList()的坑
-
返回的List是固定大小的(底层是数组),不能add/remove
-
-
emptyList() vs new ArrayList()
-
Collections.emptyList()
返回不可变的空集合(节省内存)
-