源本科技 | 码上会

Java Collection 接口

2026/01/23
35
0

学习目标

  • 理解 Collection 接口在 Java 集合框架中的核心地位

  • 掌握 Collection 接口提供的通用操作方法及其语义

  • 了解其主要子接口(List、Set、Queue 等)的特性与适用场景

  • 能够正确创建和使用 Collection 类型的引用

  • 熟练进行元素的添加、删除、遍历等基本操作


Collection 接口概述

CollectionJava 集合框架的根接口,定义在 java.util 包中。它代表一组对象(称为“元素”),并将它们视为一个逻辑单元。

核心特性

  • 动态大小:集合可自动扩容或缩容,不像数组有固定长度

  • 类型灵活:可存储同类型(泛型约束)或不同类型(原始类型)的对象

  • 操作便捷:提供 add()remove()clear() 等统一 API

  • 支持遍历:实现 Iterable<E> 接口,可用 for-each 循环或 Iterator

接口声明

public interface Collection<E> extends Iterable<E>

其中 E 表示集合中元素的类型(泛型参数)。

注意:不能直接实例化接口。必须通过其实现类(如 ArrayList)创建对象,并用 Collection 引用指向它。


创建 Collection 对象

// 正确方式:使用实现类创建,接口引用
Collection<String> fruits = new ArrayList<>();

fruits.add("Apple");
fruits.add("Banana");
System.out.println(fruits); // [Apple, Banana]

这种“面向接口编程”的方式提高了代码的灵活性和可维护性。


Collection 接口的继承体系

Collection 接口派生出多个重要子接口,形成完整的集合分类:

主要子接口说明

子接口

特性

允许重复

有序性

常见实现类

List

按插入顺序存储,支持索引访问

✅ 是

有序(插入序)

ArrayList, LinkedList

Set

不允许重复元素

❌ 否

无序(除 LinkedHashSet

HashSet, TreeSet

SortedSet

元素自动排序

❌ 否

有序(自然序 / 自定义)

TreeSet

NavigableSet

支持范围查询与导航

❌ 否

有序

TreeSet

Queue

FIFO(先进先出)队列

✅ 是

有序(队列序)

PriorityQueue, ArrayDeque

Deque

双端队列,两端可操作

✅ 是

有序

ArrayDeque, LinkedList


Collection 核心操作

1. 添加元素

  • add(E e):添加单个元素

  • addAll(Collection<? extends E> c):批量添加

Collection<Integer> nums = new ArrayList<>();
nums.add(10);
nums.add(20);

Collection<Integer> more = List.of(30, 40);
nums.addAll(more); // [10, 20, 30, 40]

2. 删除元素

  • remove(Object o):移除第一个匹配的元素

  • removeAll(Collection<?> c):移除所有出现在给定集合中的元素

  • retainAll(Collection<?> c)仅保留出现在给定集合中的元素(求交集)

  • removeIf(Predicate<E> filter):按条件删除(Java 8+)

Collection<String> fruits = new ArrayList<>(List.of("Apple", "Banana", "Mango"));
fruits.remove("Mango"); // [Apple, Banana]

fruits.removeAll(Set.of("Apple", "Banana")); // []

3. 查询与检查

  • contains(Object o):是否包含某元素

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

  • isEmpty():是否为空

  • size():元素数量

if (fruits.contains("Apple")) {
    System.out.println("We have apples!");
}

4. 遍历集合

虽然 Collection 本身不支持索引访问,但可通过以下方式遍历:

方式一:Iterator

Iterator<String> it = fruits.iterator();
while (it.hasNext()) {
    String fruit = it.next();
    System.out.print(fruit + " ");
}

方式二:for-each

for (String fruit : fruits) {
    System.out.print(fruit + " ");
}

方式三:Stream

fruits.stream().forEach(System.out::println);

注意:若需索引访问,应使用 List 接口及其实现类(如 ArrayList),调用 get(int index) 方法。


5. 转换与工具方法

  • toArray():转为对象数组

  • stream() / parallelStream():创建流用于函数式处理

  • clear():清空所有元素

  • equals() / hashCode():用于比较和哈希存储

Object[] arr = fruits.toArray();
String[] strArr = fruits.toArray(new String[0]); // 类型安全转换

Collection 接口方法

方法

描述

boolean add(E e)

添加元素(可选操作)

boolean addAll(Collection<? extends E> c)

批量添加

void clear()

清空集合

boolean contains(Object o)

是否包含指定元素

boolean containsAll(Collection<?> c)

是否包含另一集合所有元素

boolean remove(Object o)

移除一个匹配元素

boolean removeAll(Collection<?> c)

移除所有匹配元素

boolean retainAll(Collection<?> c)

仅保留匹配元素

boolean removeIf(Predicate<? super E> filter)

按条件移除(Java 8)

int size()

返回元素数量

boolean isEmpty()

是否为空

Iterator<E> iterator()

返回迭代器

Stream<E> stream()

返回顺序流

Stream<E> parallelStream()

返回并行流

Object[] toArray()

转为对象数组

T[] toArray(T[] a)

转为指定类型数组

boolean equals(Object o)

判断相等性

int hashCode()

计算哈希码

Spliterator<E> spliterator()

返回分割迭代器(用于并行处理)

注:部分方法(如 addremove)在某些不可变集合中会抛出 UnsupportedOperationException


重点总结

  • Collection 是 Java 集合框架的顶层接口,定义了通用集合操作

  • 它有三大核心子接口:List(有序可重复)、Set(无序唯一)、Queue(FIFO)

  • 通过实现类(如 ArrayListHashSet)创建对象,用接口引用操作

  • 提供统一的增删查改、遍历、转换等方法,简化集合处理

  • 面向接口编程 + 合理选择子类型 = 高效、可维护的集合代码


思考题

  1. 为什么 Collection 接口没有提供 get(int index) 方法?这体现了怎样的设计思想?

  2. 如果你有一个 Collection<String> 引用,但实际对象是 HashSet,调用 add("A") 两次会发生什么?为什么?

  3. 在多线程环境下直接使用 ArrayList 作为 Collection 的实现是否安全?如果不安全,有哪些替代方案?