JDK的数组与番石榴的不可变列表
使用 带有 和 的单行列表创建之间是否有优势?com.google.common.collect.ImmutableList.of(...)
java.util.Arrays.asList(...)
使用 带有 和 的单行列表创建之间是否有优势?com.google.common.collect.ImmutableList.of(...)
java.util.Arrays.asList(...)
该方法提供基础数组的列表视图。Arrays.asList(...)
Integer[] numbers = {17, 42, 2001};
List<Integer> list = Arrays.asList(numbers);
System.out.println(list.get(0)); // Prints 17.
list.remove(0); // throws.
numbers[0] = 1;
System.out.println(list.get(0)); // Prints 1.
list.set(0, 17);
System.out.println(numbers[0]); // Prints 17.
Arrays.asList
与不变性几乎没有关系。返回的列表不能添加或删除元素,但可以更改它,更改会更改基础数组。实际上,返回列表的类是一个特殊的类,它将数组用于存储。它类似于这样:
List<Integer> integers = new ArrayList<>();
integers.add(17);
integers.add(42);
integers.add(2001);
List<Integer> unmodifiable = Collections.unmodifiableList(integers);
unmodifiable.set(0, 1); // throws.
unmodifiable.remove(0); // throws.
unmodifiable.add(867_5309); // throws.
integers.set(0, 1) // okay.
System.out.println(unmodifiable.get(0)); // Prints 1.
只有当一个人扔掉原始列表时,这是安全的,就像这个地图示例一样。由于超出范围,因此没有什么可以改变不可修改地图的基础地图 。map
CAPITALS
public static final Map<String, String> CAPITALS;
static {
Map<String, String> map = new HashMap<>();
map.put("USA", "Washington, DC");
map.put("England", "London");
// ...
CAPITALS = Collections.unmodifiableMap(map);
}
Guava's会创建一个新的数据副本,如果原始数据本身没有永久存储。引用其文档:ImmutableList
请记住,ImmutableXXX.copyOf 会尝试避免在安全的情况下复制数据 — 确切的细节未指定,但实现通常是“智能的”。
因此,番石榴拥有不可变的收藏品,无论其来源如何。
List<Integer> original = new ArrayList<>();
original.add(1);
original.add(2);
original.add(3);
ImmutableList<Integer> immutable = ImmutableList.copyOf(original);
immutable.set(0, 42); // throws.
System.out.println(immutable.get(0)); // Prints 1.
original.set(0, 42); // fine.
System.out.println(immutable.get(0)); // Prints 1.
ImmutableList<Integer> copy = ImmutableList.copyOf(immutable);
// Shares immutable's data.