Java 教程是为 JDK 8 编写的。本页中描述的示例和实践未利用在后续版本中引入的改进。
本节描述了几种小型实现,当你不需要它们的全部功能时,它们比通用实现更方便,更高效。本节中的所有实现都是通过静态工厂方法而不是 public
类提供的。
Arrays.asList
方法返回其数组参数的 List
视图。对 List
的更改将写入数组,反之亦然。集合的大小是数组的大小,不能更改。如果在 List
上调用 add
或 remove
方法,将导致 UnsupportedOperationException
。
此实现的正常使用是作为基于队列和基于集合的 API 之间的桥梁。它允许你将数组传递给期望 Collection
或 List
的方法。但是,这种实现还有另一种用途。如果你需要固定大小的 List
,它比任何通用 List
实现更有效。这是习惯用法。
List<String> list = Arrays.asList(new String[size]);
请注意,不保留对后备队列的引用。
有时你需要一个由同一元素的多个副本组成的不可变 List
。Collections.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"));
通过使用同时采用索引和 Collection
的 addAll
形式,可以将新元素添加到 List
的中间而不是到最后。
有时你需要一个不可变的 singleton (单例) Set
,它由一个指定的元素组成。Collections.singleton
方法返回这样的 Set
。此实现的一个用途是从 Collection
中移除所有匹配项的指定元素。
c.removeAll(Collections.singleton(e));
相关的习惯用法从 Map
中移除映射到指定值的所有元素。例如,假设你有一个 Map
job
将人们映射到他们的工作线上并假设你想要消灭所有的律师。下面的一行就可以了。
job.values().removeAll(Collections.singleton(LAWYER));
此实现的另一个用途是向编写为接受值集合的方法提供单个输入值。
Collections
类提供了返回空 Set
,List
和 Map
的方法 emptySet
,emptyList
,emptyMap
。这些常量的主要用途是作为采用 Collection
值的方法的输入,而你不想提供任何值时,如本示例所示。
tourist.declarePurchases(Collections.emptySet());