文档

Java™ 教程-Java Tutorials 中文版
便利实现
Trail: Collections
Lesson: Implementations

便利实现

本节描述了几种小型实现,当你不需要它们的全部功能时,它们比通用实现更方便,更高效。本节中的所有实现都是通过静态工厂方法而不是 public 类提供的。

列表的数组视图

Arrays.asList 方法返回其数组参数的 List 视图。对 List 的更改将写入数组,反之亦然。集合的大小是数组的大小,不能更改。如果在 List 上调用 addremove 方法,将导致 UnsupportedOperationException

此实现的正常使用是作为基于队列和基于集合的 API 之间的桥梁。它允许你将数组传递给期望 CollectionList 的方法。但是,这种实现还有另一种用途。如果你需要固定大小的 List,它比任何通用 List 实现更有效。这是习惯用法。

List<String> list = Arrays.asList(new String[size]);

请注意,不保留对后备队列的引用。

不可变的多重复制列表

有时你需要一个由同一元素的多个副本组成的不可变 ListCollections.nCopies 方法返回这样的列表。该实现有两个主要用途。第一种是初始化新创建的 List;例如,假设你想要一个 ArrayList,最初由 1,000 个 null 元素组成。以下咒语起作用。

List<Type> list = new ArrayList<Type>(Collections.nCopies(1000, (Type)null);

当然,每个元素的初始值不必是 null。第二个主要用途是增加现有的 List。例如,假设你要将 "fruit bat" 的 69 个副本添加到 List<String> 的末尾。目前尚不清楚你为什么要做这样的事情,但让我们假设你做了。以下是你如何做到的。

lovablePets.addAll(Collections.nCopies(69, "fruit bat"));

通过使用同时采用索引和 CollectionaddAll 形式,可以将新元素添加到 List 的中间而不是到最后。

不可变单例集

有时你需要一个不可变的 singleton (单例) Set,它由一个指定的元素组成。Collections.singleton 方法返回这样的 Set。此实现的一个用途是从 Collection 中移除所有匹配项的指定元素。

c.removeAll(Collections.singleton(e));

相关的习惯用法从 Map 中移除映射到指定值的所有元素。例如,假设你有一个 Map — job — 将人们映射到他们的工作线上并假设你想要消灭所有的律师。下面的一行就可以了。

job.values().removeAll(Collections.singleton(LAWYER));

此实现的另一个用途是向编写为接受值集合的方法提供单个输入值。

空的 Set,List 和 Map 常量

Collections 类提供了返回空 SetListMap 的方法 — emptySetemptyListemptyMap。这些常量的主要用途是作为采用 Collection 值的方法的输入,而你不想提供任何值时,如本示例所示。

tourist.declarePurchases(Collections.emptySet());

Previous page: Wrapper Implementations
Next page: Summary of Implementations