一、定义
Collection 是 Java 单列集合的顶层接口(位于 java.util 包),定义所有单列集合的通用操作规范,用于存储多个独立元素,是 List、Set 等核心子接口的父接口,无法直接实例化,需通过其子类/实现类使用。
二、特性
-
单列存储:仅存储独立对象,区别于 Map 的键值对存储结构;
-
动态扩容:容量随元素增减自动调整,无需手动维护长度;
-
泛型支持:指定元素类型,避免类型转换异常,提升代码安全性;
-
通用操作封装:统一定义增、删、查、遍历等基础方法,子类可继承或重写;
-
非线程安全:默认实现类均为非线程安全,多线程并发修改可能抛出 ConcurrentModificationException;
-
可空性:支持存储 null 元素(具体是否允许,取决于子接口/实现类的规则)。
三、方法(通用必掌握)
- 元素添加
• boolean add(E e):添加单个元素,成功返回 true(Set 重复添加返回 false);
• boolean addAll(Collection< extends E> c):添加另一个 Collection 的所有元素,成功返回 true。
- 元素删除
• boolean remove(Object o):删除首个匹配的元素,成功返回 true;
• boolean removeAll(Collection<> c):删除两个集合的交集元素,成功返回 true;
• boolean retainAll(Collection<> c):保留两个集合的交集元素(删除非交集元素),成功返回 true;
• void clear():清空集合中所有元素,集合变为空。
- 元素查询与判断
• int size():返回集合中元素的个数;
• boolean isEmpty():判断集合是否为空(元素个数为 0 返回 true);
• boolean contains(Object o):判断集合是否包含指定元素;
• boolean containsAll(Collection<?> c):判断集合是否包含另一个 Collection 的所有元素。
- 集合遍历
• Iterator<E> iterator():返回迭代器对象,用于遍历元素;
• void forEach(Consumer<? super E> action):JDK8+ 新增,Lambda 表达式遍历(简洁高效);
• Spliterator<E> spliterator():JDK8+ 新增,支持并行遍历的分割迭代器。
- 集合转换
• Object[] toArray():将集合转为 Object 类型数组;
• <T> T[] toArray(T[] a):转为指定类型数组(推荐,避免后续类型转换)。
四、核心子接口(核心分支)
Collection 仅定义规范,核心能力由子接口实现,两大核心分支:
-
List 接口:有序、可重复、支持索引,可精确控制元素位置(实现类:ArrayList、LinkedList 等);
-
Set 接口:无序、不可重复、无索引,自动去重(实现类:HashSet、TreeSet 等);
-
扩展子接口(了解):
◦ Queue:队列接口,先进先出(FIFO),实现类:LinkedList、PriorityQueue;
◦ Deque:双端队列接口,首尾均可增删,实现类:LinkedList、ArrayDeque;
◦ SortedSet:有序 Set 接口,元素按规则排序,实现类:TreeSet。
五、线程安全解决方案
Collection 及其默认实现类均非线程安全,多线程并发场景解决方案:
-
工具类包装:Collections.synchronizedCollection(Collection<T> c),底层加锁,简单但效率低;
-
JUC 并发集合:使用 java.util.concurrent 包下的实现类(如 CopyOnWriteArrayList、ConcurrentLinkedQueue),读写分离,效率更高。
六、注意事项
-
contains/remove 方法:依赖元素的 equals() 方法(无重写则用 Object 类的地址比较,可能不符合预期);
-
泛型规范:定义时指定泛型(如 Collection<String>),避免用 Collection<Object> 导致类型转换错误;
-
toArray 方法:无参方法返回 Object 数组,强转可能报错,优先用带参指定类型的重载方法;
-
空集合处理:避免直接使用 null 表示空集合,可使用 Collections.emptyList()/Collections.emptySet()(不可修改)或新建空实现类(可修改)。