有效地“修改”ImmutableMap

时间:2012-02-01 05:55:31

标签: java map immutability guava

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

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

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

这就是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 */

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

这很慢。

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

所以我想:

  1. 是否有某种番石榴实用工具被埋在某处? (它不在地图或ImmutableMap.Builder中。)

  2. 是否有其他Java库可以解决这类问题?我的印象是Clojure有这样的东西,但我们还没准备好转换语言......

1 个答案:

答案 0 :(得分:6)

有点出乎意料map of Functional Java像Guava一样可变。正如我所料,该列表是不可变的。

谷歌搜索“持久集合java”提出:pcollections。有一个Map implementation

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

相关问题