容器(Container)

147 阅读4分钟

数组的优缺点:

  • 数组的优点:一种简单的线性序列,可以快速的访问数组元素,效率比较高。如果从效率和类型检查的角度讲,数组最好。

  • 数组的劣势:

    • 长度固定,无法动态扩容;
    • 仅支持同一种类型
    • 缺乏便捷的操作方法:数组仅提供 “通过索引访问 / 修改元素” 的基础功能,没有内置的增删改查、排序、去重等常用方法,所有操作都需手动实现,代码冗余且易出错。

image.png

image.png

容器

在java中,容器(Container)是用于存储、管理和操作对象的集合类,核心作用是替代数组的局限性(固定长度、仅存同类型元素、缺乏便捷操作),提供更灵活、高效的数据存储方案。

Java 容器的顶层设计围绕 接口 展开,核心分为两大体系:Collection(存储 “单个元素” 的集合)和 Map(存储 “键值对(Key-Value)” 的映射表);

1. 容器的结构: 单例集合,双例集合

image.png

1.1 单例集合

单例集合:将数据一个一个存储

image.png

Collection:单例集合的根接口,它有两个子接口是List接口,Set接口;它的抽象方法包括:增删改查、批量操作、遍历与判断 四大类,所有实现类(如 ArrayListHashSetLinkedList)都必须实现这些方法(或通过父类间接实现)。

抽象方法:

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的结构存储数据

image.png