假设我有以下 map 定义:
Map<String, List<Set<Integer>>> map = Maps.newHashMap();
map.put("a", Arrays.asList(Sets.newHashSet(1, 2, 3), Sets.newHashSet(4, 5)));
我创建了 map 的不可变副本,如下所示:
ImmutableMap<String, List<Set<Integer>>> immutableMap = ImmutableMap.copyOf(map);
如果我打电话immutableMap.get("a").add(Sets.newHashSet(4));
我收到一个错误,表明嵌套
列表在复制的集合中也是不可变的。但是,如果调用
immutableMap.get("a").get(1).add(6);
可以执行,如果我打印出结果,我将得到:
{a=[[1, 2, 3], [4, 5, 6]]}
这是否意味着copyOf
只使嵌套的不可变集合深一层?
最佳答案
不,那是因为 Arrays#asList(Object...)
返回一个固定大小的 List
,即。您无法从中添加或删除元素。
ImmutableMap#copyOf(..)
javadoc 指出
Returns an immutable map containing the same entries as map.
因此,带有键 "a"
的条目的值是 Arrays#asList(Object...)
返回的 List
。
关于java - Guava copyOf 嵌套集合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27652091/