Java教程是针对JDK 8编写的。本页中描述的示例和实践不利用后续版本中引入的改进,并可能使用不再可用的技术。
有关Java SE 9及后续版本中更新的语言功能的摘要,请参阅Java语言变化。
有关所有JDK版本的新功能、增强功能和已删除或弃用选项的信息,请参阅JDK发布说明。
本节介绍了几种小型实现,当您不需要它们的全部功能时,这些实现可能比通用实现更方便、更高效。本节中的所有实现都是通过静态工厂方法提供的,而不是通过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
;例如,假设您想要一个最初包含1,000个null
元素的ArrayList
。以下咒语可以实现。
List<Type> list = new ArrayList<Type>(Collections.nCopies(1000, (Type)null));
当然,每个元素的初始值不一定是null
。第二个主要用途是扩展现有的List
。例如,假设您想要在List<String>
的末尾添加69个字符串"fruit bat"
。不清楚为什么您要这样做,但假设您确实要这样做。以下是实现的方法。
lovablePets.addAll(Collections.nCopies(69, "fruit bat"));
通过使用同时接受索引和Collection
的addAll
形式,您可以将新元素添加到List
的中间,而不是末尾。
有时您需要一个不可变的单例Set
,它由一个指定的元素组成。Collections.singleton
方法返回这样一个Set
。这种实现的一个用途是从Collection
中删除所有出现的指定元素。
c.removeAll(Collections.singleton(e));
一个相关的惯用语从Map
中删除所有映射到指定值的元素。例如,假设你有一个将人们与他们的工作关联起来的Map
,并且你想要消除所有的律师。下面的一行代码就可以实现这个目标。
job.values().removeAll(Collections.singleton(LAWYER));
这种实现的另一个用途是向一个接受值集合的方法提供单个输入值。
Collections类提供了返回空Set
、List
和Map
的方法——emptySet、emptyList和emptyMap。这些常量的主要用途是作为没有提供任何值时的方法输入的集合,就像这个例子中一样。
tourist.declarePurchases(Collections.emptySet());