java - Guava copyOf 嵌套集合

标签 java guava

假设我有以下 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/

相关文章:

java - 选择 ImageView 中的内容 - Android

java - 我在Java中使用这个方法调用时调用的方法是什么?

java - 为什么 Guava 不提供转换映射键的方法

Java - 为过滤功能创建循环

java - 谷歌 Guava : Supported way to get elements of a collection that comply with a given predicate?

java - 如何将 JSON 参数映射到 Jersey 参数?

java - 如何在java中的while循环中设置switch语句

java - 公钥或私钥作为连接远程数据库的密码,ssh

java - Guava 中的 ListenableFuture 将在哪个线程中调用 FutureCallback?

java - 多行字符串到数组