Java Collection 接口

更新于 2025-12-26

Jakob Jenkov 2019-03-14

Java 的 Collection 接口(java.util.Collection)是 Java 集合 API 的根接口之一。虽然你不会直接实例化一个 Collection,而是使用其子类型,但通常你可以将这些子类型统一视为 Collection。本文将介绍如何使用它。

创建 Collection

如前所述,你不会直接创建 Collection 实例,而是创建 Collection 的某个子类型的实例。下面是一个创建 ListCollection 的子类型)的示例:

Collection collection = new ArrayList();

上述示例适用于所有 Collection 的子类型。

Collection 的子类型

以下接口(集合类型)继承自 Java 的 Collection 接口:

Java 并未提供一个可直接使用的 Collection 接口实现类,因此你必须使用上述列出的子类型之一。Collection 接口只是定义了这些子类型所共有的方法(行为)。这使得你可以忽略具体使用的是哪种 Collection 类型,而将其统一当作 Collection 来处理。这是标准的继承机制,并无神奇之处,但在某些情况下非常有用。本文后续部分将介绍其中最常用的一些通用操作。

下面是一个操作 Collection 的方法示例:

public class MyCollectionUtil {
    public static void doSomething(Collection collection) {
        Iterator iterator = collection.iterator();
        while (iterator.hasNext()) {
            Object object = iterator.next();
            // 在此处对 object 进行某些操作...
        }
    }
}

以下是使用不同 Collection 子类型调用该方法的几种方式:

Set set = new HashSet();
List list = new ArrayList();

MyCollectionUtil.doSomething(set);
MyCollectionUtil.doSomething(list);

向 Collection 中添加元素

无论你使用的是哪种 Collection 子类型,都有几个标准方法用于向集合中添加元素。通过 add() 方法可以向 Collection 添加元素。以下是一个向 Java Collection 添加元素的示例:

String anElement = "an element";
Collection collection = new HashSet();
boolean didCollectionChange = collection.add(anElement);

add() 方法会将指定元素添加到集合中,并返回一个布尔值,表示由于调用 add() 方法后 Collection 是否发生了变化。例如,对于 Set 而言,如果集合中已包含该元素,则不会再次添加,因此不会发生变化;而对于 List,即使列表中已存在该元素,仍会再次添加,导致该元素在列表中出现两次。

从 Collection 中移除元素

remove() 方法用于从 Collection 中移除指定元素。如果该元素存在于集合中并被成功移除,则返回 true;否则返回 false。以下是从 Java Collection 中移除元素的示例:

boolean wasElementRemoved = collection.remove("an element");

向 Collection 中批量添加元素

你也可以使用 addAll() 方法将一个集合作为整体中的所有元素添加到另一个 Collection 中。示例如下:

Set aSet = ... // 从某处获取一个包含元素的 Set
Collection collection = new HashSet();
collection.addAll(aSet); // 也返回 boolean,此处忽略

Java 的 Collection.addAll() 方法会将参数集合中的所有元素添加到目标集合中,而不是添加集合对象本身。如果你错误地调用了 add() 并传入整个集合对象作为参数,那么添加的就是该集合对象本身,而非其内部元素。

addAll() 方法的具体行为取决于所使用的 Collection 子类型。有些子类型允许多次添加相同元素(如 List),而有些则不允许(如 Set)。

从 Collection 中批量移除元素

Java 的 Collection.removeAll() 方法会移除目标集合中所有出现在参数集合中的元素。如果参数集合中包含目标集合中不存在的元素,这些元素会被忽略。示例如下:

Collection objects = //... 从某处获取一个元素集合
collection.removeAll(objects);

保留两个集合的交集元素

Java 的 Collection.retainAll() 方法与 removeAll() 相反。它不会移除参数集合中的元素,而是保留这些元素,并移除所有其他元素。注意:只有当目标集合中原本就包含这些元素时,它们才会被保留;参数集合中存在但目标集合中不存在的新元素不会被自动添加,而是被忽略。

示例如下:

Collection colA = new ArrayList();
Collection colB = new ArrayList();

colA.add("A");
colA.add("B");
colA.add("C");

colB.add("1");
colB.add("2");
colB.add("3");

Collection target = new HashSet();
target.addAll(colA);     // target 现在包含 [A, B, C]
target.addAll(colB);     // target 现在包含 [A, B, C, 1, 2, 3]
target.retainAll(colB);  // target 现在只包含 [1, 2, 3]

检查 Collection 是否包含特定元素

Collection 接口提供了两个方法用于检查集合是否包含一个或多个特定元素:contains()containsAll()。示例如下:

Collection collection = new HashSet();
boolean containsElement = collection.contains("an element");

Collection elements = new HashSet();
boolean containsAll = collection.containsAll(elements);
  • contains():如果集合包含指定元素则返回 true,否则返回 false
  • containsAll():如果集合包含参数集合中的所有元素则返回 true,否则返回 false

获取 Collection 的大小

你可以使用 size() 方法获取集合的大小(即元素数量)。示例如下:

int numberOfElements = collection.size();

遍历 Collection

你可以遍历集合中的所有元素。这可以通过从集合中获取一个 Java Iterator 并进行迭代来实现。示例如下:

Collection collection = new HashSet();
// ... 向集合中添加元素

Iterator iterator = collection.iterator();
while (iterator.hasNext()) {
    Object object = iterator.next();
    System.out.println(object);
}

你也可以使用 Java for-each 循环 来遍历 Collection

Collection collection = new HashSet();
collection.add("A");
collection.add("B");
collection.add("C");

for (Object object : collection) {
    System.out.println(object);
}