Collection接口

一、定义

Collection 是 Java 单列集合的顶层接口(位于 java.util 包),定义所有单列集合的通用操作规范,用于存储多个独立元素,是 List、Set 等核心子接口的父接口,无法直接实例化,需通过其子类/实现类使用。

二、特性

  1. 单列存储:仅存储独立对象,区别于 Map 的键值对存储结构;

  2. 动态扩容:容量随元素增减自动调整,无需手动维护长度;

  3. 泛型支持:指定元素类型,避免类型转换异常,提升代码安全性;

  4. 通用操作封装:统一定义增、删、查、遍历等基础方法,子类可继承或重写;

  5. 非线程安全:默认实现类均为非线程安全,多线程并发修改可能抛出 ConcurrentModificationException;

  6. 可空性:支持存储 null 元素(具体是否允许,取决于子接口/实现类的规则)。

三、方法(通用必掌握)

  1. 元素添加

• boolean add(E e):添加单个元素,成功返回 true(Set 重复添加返回 false);

• boolean addAll(Collection< extends E> c):添加另一个 Collection 的所有元素,成功返回 true。

  1. 元素删除

• boolean remove(Object o):删除首个匹配的元素,成功返回 true;

• boolean removeAll(Collection<> c):删除两个集合的交集元素,成功返回 true;

• boolean retainAll(Collection<> c):保留两个集合的交集元素(删除非交集元素),成功返回 true;

• void clear():清空集合中所有元素,集合变为空。

  1. 元素查询与判断

• int size():返回集合中元素的个数;

• boolean isEmpty():判断集合是否为空(元素个数为 0 返回 true);

• boolean contains(Object o):判断集合是否包含指定元素;

• boolean containsAll(Collection<?> c):判断集合是否包含另一个 Collection 的所有元素。

  1. 集合遍历

• Iterator<E> iterator():返回迭代器对象,用于遍历元素;

• void forEach(Consumer<? super E> action):JDK8+ 新增,Lambda 表达式遍历(简洁高效);

• Spliterator<E> spliterator():JDK8+ 新增,支持并行遍历的分割迭代器。

  1. 集合转换

• Object[] toArray():将集合转为 Object 类型数组;

• <T> T[] toArray(T[] a):转为指定类型数组(推荐,避免后续类型转换)。

四、核心子接口(核心分支)

Collection 仅定义规范,核心能力由子接口实现,两大核心分支:

  1. List 接口:有序、可重复、支持索引,可精确控制元素位置(实现类:ArrayList、LinkedList 等);

  2. Set 接口:无序、不可重复、无索引,自动去重(实现类:HashSet、TreeSet 等);

  3. 扩展子接口(了解):

◦ Queue:队列接口,先进先出(FIFO),实现类:LinkedList、PriorityQueue;

◦ Deque:双端队列接口,首尾均可增删,实现类:LinkedList、ArrayDeque;

◦ SortedSet:有序 Set 接口,元素按规则排序,实现类:TreeSet。

五、线程安全解决方案

Collection 及其默认实现类均非线程安全,多线程并发场景解决方案:

  1. 工具类包装:Collections.synchronizedCollection(Collection<T> c),底层加锁,简单但效率低;

  2. JUC 并发集合:使用 java.util.concurrent 包下的实现类(如 CopyOnWriteArrayList、ConcurrentLinkedQueue),读写分离,效率更高。

六、注意事项

  1. contains/remove 方法:依赖元素的 equals() 方法(无重写则用 Object 类的地址比较,可能不符合预期);

  2. 泛型规范:定义时指定泛型(如 Collection<String>),避免用 Collection<Object> 导致类型转换错误;

  3. toArray 方法:无参方法返回 Object 数组,强转可能报错,优先用带参指定类型的重载方法;

  4. 空集合处理:避免直接使用 null 表示空集合,可使用 Collections.emptyList()/Collections.emptySet()(不可修改)或新建空实现类(可修改)。

相关推荐
Johny_Zhao7 小时前
OpenClaw安装部署教程
linux·人工智能·ai·云计算·系统运维·openclaw
IVEN_15 小时前
只会Python皮毛?深入理解这几点,轻松进阶全栈开发
python·全栈
Ray Liang16 小时前
用六边形架构与整洁架构对比是伪命题?
java·python·c#·架构设计
AI攻城狮16 小时前
如何给 AI Agent 做"断舍离":OpenClaw Session 自动清理实践
python
千寻girling16 小时前
一份不可多得的 《 Python 》语言教程
人工智能·后端·python
AI攻城狮20 小时前
用 Playwright 实现博客一键发布到稀土掘金
python·自动化运维
阿白的白日梦20 小时前
winget基础管理---更新/修改源为国内源
windows
曲幽20 小时前
FastAPI分布式系统实战:拆解分布式系统中常见问题及解决方案
redis·python·fastapi·web·httpx·lock·asyncio
孟健1 天前
Karpathy 用 200 行纯 Python 从零实现 GPT:代码逐行解析
python