本节描述了一些微型实现,当您不需要通用实现时,它们会比通用实现更方便,更高效。本节中的所有实现都是通过静态工厂方法而不是public
类提供的。
数组的List视图
Arrays.asList
方法返回其数组参数的List
视图。对List
的更改将直写到数组,反之亦然。集合的大小是数组的大小,无法更改。如果在List
上调用add
或remove
方法,则将导致UnsupportedOperationException
。
此实现的正常使用是在基于数组的API和基于集合的API之间建立桥梁。它允许您将数组传递给需要Collection
或List
的方法。但是,此实现还有其他用途。如果您需要固定大小的List
,则它比任何通用List
实现更有效。这是习语。
List<String> list = Arrays.asList(new String[size]);
不变的多重复制List
有时,您将需要一个由相同元素的多个副本组成的不可变List
。Collections.nCopies
方法返回这样的列表。此实现有两个主要用途。首先是初始化一个新创建的List
;例如,假设您想要一个最初由1,000个null
元素组成的ArrayList
。下面的咒语可以解决问题。
List<Type> list = new ArrayList<Type>(Collections.nCopies(1000, (Type)null);
当然,每个元素的初始值不必为null
。第二个主要用途是增长现有List
。例如,假设您想将69个字符串“fruit bat
”添加到List<String>
的末尾。目前尚不清楚您为什么要这样做,但是假设您这样做了。以下是您的操作方法。
lovablePets.addAll(Collections.nCopies(69, "fruit bat"));
通过使用同时具有索引和Collection
的addAll
形式,可以将新元素添加到List
的中间而不是其末尾。
不变的单个Set
有时,您需要一个不变的单个Set
,它由一个指定的元素组成。Collections.singleton
方法返回这样的Set
。此实现的一种用法是从Collection
中删除所有出现的指定元素。
c.removeAll(Collections.singleton(e));
一个相关的惯用法会从Map
中删除所有映射到指定值的元素。例如,假设您有一个Map
——job
,可将人们映射到他们的工作范围,并假设您想淘汰所有律师。接下来的一行将成为现实。
job.values().removeAll(Collections.singleton(LAWYER));
此实现的另一种用法是向编写为接受值集合的方法提供单个输入值。
空的Set, List, and Map常量
Collections
类提供了返回空的Set
,List
和Map
的方法—— emptySet
, emptyList
和 emptyMap
。这些常量的主要用途是作为您根本不想提供任何Collection
值的方法的输入,如本例所示。
tourist.declarePurchases(Collections.emptySet());