便利实现
原文: https://docs.oracle.com/javase/tutorial/collections/implementations/convenience.html
本节描述了几种小型实现,当您不需要它们的全部功能时,它们比通用实现更方便,更高效。本节中的所有实现都是通过静态工厂方法而不是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
。例如,假设您要将"fruit bat"
的 69 个副本添加到List<String>
的末尾。目前尚不清楚你为什么要做这样的事情,但让我们假设你做了。以下是你如何做到的。
lovablePets.addAll(Collections.nCopies(69, "fruit bat"));
通过使用同时采用索引和Collection
的addAll
形式,可以将新元素添加到List
的中间而不是它的末尾。
不可变单身集
有时候你需要一个不可变的*单例 _ Set
,它由一个指定的元素组成。 Collections.singleton
方法返回这样的Set
。此实现的一个用途是从Collection
中删除所有出现的指定元素。
c.removeAll(Collections.singleton(e));
相关的习语从Map
中删除映射到指定值的所有元素。例如,假设您有一个Map
- job
- 将人们映射到他们的工作线上,并假设您想要消除所有律师。以下单行将做的事情。
job.values().removeAll(Collections.singleton(LAWYER));
此实现的另一个用途是为编写为接受值集合的方法提供单个输入值。
空集,列表和地图常量
Collections
类提供返回空Set
,List
和Map
- emptySet
, emptyList
的方法,和 emptyMap
。这些常量的主要用途是当您不想提供任何值时采用Collection
值的方法的输入,如本示例所示。
tourist.declarePurchases(Collections.emptySet());