文档

Java™ 教程
隐藏目录
便利实现
路径: 集合
课程: 实现

方便实现

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

数组的列表视图

Arrays.asList方法返回其数组参数的List视图。对List进行的更改会直接反映到数组中,反之亦然。集合的大小与数组的大小相同,不能更改。如果在List上调用addremove方法,将导致UnsupportedOperationException

这种实现的常规用法是作为基于数组和基于集合的API之间的桥梁。它允许您将数组传递给期望CollectionList的方法。然而,这种实现还有另一种用途。如果您需要一个固定大小的List,它比任何通用List实现更高效。这就是惯用法。

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

请注意,不保留对支持数组的引用。

不可变的多重副本列表

偶尔您可能需要一个由多个相同元素组成的不可变ListCollections.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"));

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

不可变的单例集合

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

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

一个相关的惯用语从Map中删除所有映射到指定值的元素。例如,假设你有一个将人们与他们的工作关联起来的Map,并且你想要消除所有的律师。下面的一行代码就可以实现这个目标。

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

这种实现的另一个用途是向一个接受值集合的方法提供单个输入值。

空集、列表和映射常量

Collections类提供了返回空SetListMap的方法——emptySetemptyListemptyMap。这些常量的主要用途是作为没有提供任何值时的方法输入的集合,就像这个例子中一样。

tourist.declarePurchases(Collections.emptySet());

上一页: 封装实现
下一页: 实现总结