本节描述了一些微型实现,当您不需要通用实现时,它们会比通用实现更方便,更高效。本节中的所有实现都是通过静态工厂方法而不是public类提供的。

数组的List视图

Arrays.asList方法返回其数组参数的List视图。对List的更改将直写到数组,反之亦然。集合的大小是数组的大小,无法更改。如果在List上调用addremove方法,则将导致UnsupportedOperationException
此实现的正常使用是在基于数组的API和基于集合的API之间建立桥梁。它允许您将数组传递给需要CollectionList的方法。但是,此实现还有其他用途。如果您需要固定大小的List,则它比任何通用List实现更有效。这是习语。

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

请注意,未保留对后备数组的引用。

不变的多重复制List

有时,您将需要一个由相同元素的多个副本组成的不可变ListCollections.nCopies方法返回这样的列表。此实现有两个主要用途。首先是初始化一个新创建的List;例如,假设您想要一个最初由1,000个null元素组成的ArrayList。下面的咒语可以解决问题。

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

当然,每个元素的初始值不必为null。第二个主要用途是增长现有List。例如,假设您想将69个字符串“fruit bat”添加到List<String>的末尾。目前尚不清楚您为什么要这样做,但是假设您这样做了。以下是您的操作方法。

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

通过使用同时具有索引和CollectionaddAll形式,可以将新元素添加到List的中间而不是其末尾。

不变的单个Set

有时,您需要一个不变的单个Set,它由一个指定的元素组成。Collections.singleton方法返回这样的Set。此实现的一种用法是从Collection中删除所有出现的指定元素。

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

一个相关的惯用法会从Map中删除所有映射到指定值的元素。例如,假设您有一个Map——job,可将人们映射到他们的工作范围,并假设您想淘汰所有律师。接下来的一行将成为现实。

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

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

空的Set, List, and Map常量

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

  1. tourist.declarePurchases(Collections.emptySet());