# 方便实现

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

# 列出数组的视图

Arrays.asList 方法返回 List 其数组参数的视图。集合的大小是数组的大小,不能更改, 如果调用 add 或者 remove 方法将抛出异常 UnsupportedOperationException

返回一个受指定数组支持的固定大小的列表。(对返回列表的更改会“直接写”到数组。)此方法同 Collection.toArray() 一起, 充当了基于数组的 API 与基于 collection 的 API 之间的桥梁。返回的列表是可序列化的,并且实现了 RandomAccess。

所以注意不要保留数组的引用。

# 不可变重复列表

返回由指定对象的 n 个副本组成的不可变列表。新分配的数据对象非常小(它只包含一个对该数据对象的引用)。 在通过与 List.addAll 方法组合来增大列表时,此方法很有用。返回的列表是可序列化的。

这种实现有两个主要用途。第一个是初始化一个新创建的 List,假设你希望最初由 1000 个 null 元素组成。

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

当然,每个元素的初始值不需要 null。

第二个主要用途是增长现有的 List。假设您要将字符串 "fruit bat" 的 69 个副本添加到 List<String> 末尾。

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

还可以通过 addAll(int index, Collection<? extends E> c) 来添加到列表的中间。

# 不可变单元素 set

有时你需要一个不可变 Set 的单例,它由一个单独的指定元素组成。该 Collections.singleton 方法返回这样的 Set。 此实现的一个用途是从某个 Collection 中删除一个 等于 该单例 set 的元素。

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

在 map 中删除

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

# Empty Set, List, and Map Constants

Collections.emptySet()
1