有效地"修改"ImmutableMap

Tre*_*kaz 13 java map immutability guava

我们目前正在使用Guava作为其不可变的集合,但我很惊讶地发现他们的地图没有方法可以轻松创建新的地图并进行微小的修改.最重要的是,他们的构建器不允许为键分配新值或删除键.

因此,如果我只想修改一个值,这就是我希望能够做到的:

ImmutableMap<Guid, ImmutableMap<String, Integer>> originalMap = /* get the map */;
ImmutableMap<Guid, ImmutableMap<String, Integer>> modifiedMap =
    originalMap.cloneAndPut(key, value);
Run Code Online (Sandbox Code Playgroud)

这就是Guava期待我做的事情:

ImmutableMap<Guid, ImmutableMap<String, Integer>> originalMap = /* get the map */;
Map<Guid, ImmutableMap<String, Integer>> mutableCopy = new LinkedHashMap<>(originalMap);
mutableCopy.put(key, value);
originalMap = ImmutableMap.copyOf(mutableCopy);
/* put the map back */
Run Code Online (Sandbox Code Playgroud)

通过这样做,我得到了我想要的修改的地图的新副本.原始副本不受影响,我将使用原子引用将事物放回去,因此整个设置是线程安全的.

这很慢.

这里有很多浪费的复制品.假设地图中有1,024个桶.当你可以按原样使用那些不可变的桶并且只克隆其中一个时,那就是你不必要地重新创建的1,023个桶(也是每个两次).

所以我想:

  1. 是否有一种Guava实用方法埋在某处用于此类事情?(它不在地图或ImmutableMap.Builder中.)

  2. 有没有其他Java库可以做到这一点?我的印象是Clojure有这样的东西但我们还没准备好转换语言......

Tho*_*ung 6

有点出乎意料的功能Java地图像 Guava一样可变.正如我所料,这个列表是不可变的.

谷歌搜索"持久集合java"提出:pcollections.有一个Map实现.

在实际使用任何其他实现之前,我将针对Guava对内存和性能特征进行基准测试.如果它仍然更好,我不会感到惊讶.