Jakob Jenkov 2019-03-14
Java 的 Collection 接口(java.util.Collection)是 Java 集合 API 的根接口之一。虽然你不会直接实例化一个 Collection,而是使用其子类型,但通常你可以将这些子类型统一视为 Collection。本文将介绍如何使用它。
创建 Collection
如前所述,你不会直接创建 Collection 实例,而是创建 Collection 的某个子类型的实例。下面是一个创建 List(Collection 的子类型)的示例:
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);
}