# 便利实现

> 原文： [https://docs.oracle.com/javase/tutorial/collections/implementations/convenience.html](https://docs.oracle.com/javase/tutorial/collections/implementations/convenience.html)

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

## 列表的数组视图

[`Arrays.asList`](https://docs.oracle.com/javase/8/docs/api/java/util/Arrays.html#asList-T...-) 方法返回其数组参数的`List`视图。对`List`的更改写入数组，反之亦然。集合的大小是数组的大小，不能更改。如果在`List`上调用`add`或`remove`方法，将产生`UnsupportedOperationException`。

此实现的正常使用是作为基于阵列和基于集合的 API 之间的桥梁。它允许您将数组传递给期望`Collection`或`List`的方法。但是，这种实现还有另一种用途。如果您需要固定大小的`List`，它比任何通用`List`实现更有效。这是成语。

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

```

请注意，不保留对后备阵列的引用。

## 不可变的多重复制列表

偶尔你需要一个由同一元素的多个副本组成的不可变`List`。 [`Collections.nCopies`](https://docs.oracle.com/javase/8/docs/api/java/util/Collections.html#nCopies-int-T-) 方法返回这样的列表。该实现有两个主要用途。第一种是初始化新创建的`List`;例如，假设您想要一个最初由 1,000 `null`元素组成的`ArrayList`。以下咒语起作用。

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

```

当然，每个元素的初始值不必是`null`。第二个主要用途是增加现有的`List`。例如，假设您要将`"fruit bat"`的 69 个副本添加到`List&lt;String&gt;`的末尾。目前尚不清楚你为什么要做这样的事情，但让我们假设你做了。以下是你如何做到的。

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

```

通过使用同时采用索引和`Collection`的`addAll`形式，可以将新元素添加到`List`的中间而不是它的末尾。

## 不可变单身集

有时候你需要一个不可变的 _ 单例 _ `Set`，它由一个指定的元素组成。 [`Collections.singleton`](https://docs.oracle.com/javase/8/docs/api/java/util/Collections.html#singleton-T-) 方法返回这样的`Set`。此实现的一个用途是从`Collection`中删除所有出现的指定元素。

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

```

相关的习语从`Map`中删除映射到指定值的所有元素。例如，假设您有一个`Map` - `job` - 将人们映射到他们的工作线上，并假设您想要消除所有律师。以下单行将做的事情。

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

```

此实现的另一个用途是为编写为接受值集合的方法提供单个输入值。

## 空集，列表和地图常量

[`Collections`](https://docs.oracle.com/javase/8/docs/api/java/util/Collections.html) 类提供返回空`Set`，`List`和`Map` - [`emptySet`](https://docs.oracle.com/javase/8/docs/api/java/util/Collections.html#emptySet--) ， [`emptyList`](https://docs.oracle.com/javase/8/docs/api/java/util/Collections.html#emptyList--) 的方法，和 [`emptyMap`](https://docs.oracle.com/javase/8/docs/api/java/util/Collections.html#emptyMap--) 。这些常量的主要用途是当您不想提供任何值时采用`Collection`值的方法的输入，如本示例所示。

```
tourist.declarePurchases(Collections.emptySet());

```