数组的优缺点:
-
数组的优点:一种简单的线性序列,可以快速的访问数组元素,效率比较高。如果从效率和类型检查的角度讲,数组最好。
-
数组的劣势:
- 长度固定,无法动态扩容;
- 仅支持同一种类型
- 缺乏便捷的操作方法:数组仅提供 “通过索引访问 / 修改元素” 的基础功能,没有内置的增删改查、排序、去重等常用方法,所有操作都需手动实现,代码冗余且易出错。
容器
在java中,容器(Container)是用于存储、管理和操作对象的集合类,核心作用是替代数组的局限性(固定长度、仅存同类型元素、缺乏便捷操作),提供更灵活、高效的数据存储方案。
Java 容器的顶层设计围绕 接口 展开,核心分为两大体系:Collection(存储 “单个元素” 的集合)和 Map(存储 “键值对(Key-Value)” 的映射表);
1. 容器的结构: 单例集合,双例集合
1.1 单例集合
单例集合:将数据一个一个存储
Collection:单例集合的根接口,它有两个子接口是List接口,Set接口;它的抽象方法包括:增删改查、批量操作、遍历与判断 四大类,所有实现类(如 ArrayList、HashSet、LinkedList)都必须实现这些方法(或通过父类间接实现)。
抽象方法:
1.1.1 增加元素
| 方法 | 功能描述 | 返回值及注意事项 |
|---|---|---|
| boolean add(E e) | 向集合中添加一个元素,add(E e):将元素添加到列表末尾(固定位置) | true:元素添加成功(集合发生变化);失败:(如 Set 重复元素、队列满) |
| boolean addAll(Collection<? extends E>c) | 将另一个集合c的所有元素添加到当地集合 | true:当前集合发生变化,至少添加进去1个;false:无元素添加(如c为空) |
注意:
add()失败的场景:Set添加重复元素、Queue(如有界队列)满了、集合是只读的(如Collections.unmodifiableCollection()创建的集合)。addAll()是 “批量添加”,若目标集合与当前集合是同一对象,可能导致无限循环(需避免)
1.1.2 删除元素
| 方法签名 | 功能描述 | 返回值、注意事项 |
|---|---|---|
| boolean remove(Object o) | 从集合中删除第一个与o相等的元素(依赖equals()判断相等) | true删除成功,集合发生变化;false无此元素或者删除失败 |
| boolean removeAll(Collection<?>c) | 删除当前集合中所有在集合c中的元素(交集删除) | true: 当前集合发生变化;false:无任何元素被删除 |
| boolean remainAll(Collection<?>c) | 保留当前集合仅在c中存在的元素(交集保留,即筛选) | true:当前集合发生变化(有元素被移除);false:集合无变化 |
| void clear() | 清空集合中所有元素,集合变为空(size=0) | 无返回值,注意:清空后需确保无外部引用,否则可能导致内存泄漏 |
关键说明:
remove(Object o)传入null时,会删除集合中第一个null元素(若集合允许存储null,如ArrayList)。removeAll()和retainAll()会修改当前集合,而非返回新集合(若需保留原集合,需先拷贝)。
1.1.3 元素查询与数量(查)
| 方法签名 | 功能描述 | 返回值、注意事项 |
|---|---|---|
| int size() | 获取集合中实际存储的元素个数(区别于数组ength容量) | 返回非负整数(0 表示空集合) |
| boolean isEmpty() | 判断集合是否为空(元素个数为 0) | 等价于 size() == 0,但效率可能更高 |
| boolean contains(Object o) | 判断集合是否包含指定元素(基于 equals()) | 若元素为 null,则判断是否包含 null(需集合支持 null 元素) |
| boolean containsAll(Collection<?> c) | 判断当前集合是否包含参数集合的所有元素 | 若参数集合为空,返回 true(空集合是所有集合的子集) |
1.1.4 遍历转换相关
| 方法签名 | 功能描述 | 返回值、注意事项 |
|---|---|---|
| Iterator iterator() | 返回集合的迭代器(用于遍历元素) | 迭代器支持 hasNext()、next()、remove() 操作;遍历中删除元素必须通过迭代器的 remove(),否则可能抛 ConcurrentModificationException |
| Object[] toArray() | 将集合转换为 Object 数组 | 返回的数组是新创建的,修改数组不影响原集合 |
| T[] toArray(T[] a) | 将集合转换为指定类型的数组 | 若参数数组长度 >= 集合大小,直接使用该数组;否则创建新数组(推荐使用,避免类型转换) |
List、Set是Collection 的子接口,意味着所有的List、Set的实现类都有上面的方法。
1.2 双例集合
基于key 与 value的结构存储数据