我们说我有以下地图定义:
Map<String, List<Set<Integer>>> map = Maps.newHashMap();
map.put("a", Arrays.asList(Sets.newHashSet(1, 2, 3), Sets.newHashSet(4, 5)));
我按如下方式创建地图的不可变副本:
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
仅使嵌套的不可变集合深入一层?
答案 0 :(得分:3)
不,那是因为Arrays#asList(Object...)
返回固定大小的List
,即。您无法添加或删除元素。
ImmutableMap#copyOf(..)
javadoc状态
返回包含与map相同的条目的不可变映射。
因此,密钥为"a"
的条目的值为List
返回的Arrays#asList(Object...)
。