番石榴copyOf嵌套集合

时间:2014-12-26 01:41:51

标签: java guava

我们说我有以下地图定义:

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仅使嵌套的不可变集合深入一层?

1 个答案:

答案 0 :(得分:3)

不,那是因为Arrays#asList(Object...)返回固定大小的List,即。您无法添加或删除元素。

ImmutableMap#copyOf(..) javadoc状态

  

返回包含与map相同的条目的不可变映射。

因此,密钥为"a"的条目的值为List返回的Arrays#asList(Object...)