将不可变地图Java转换为可变地图Java

Converting immutable to mutable map java

提问人:oescc 提问时间:1/14/2022 最后编辑:oescc 更新时间:1/14/2022 访问量:6825

问:

我有一个不可变的地图,我从另一部分的方法中获得。在处理时,我想从中删除一个键,然后进一步使用它,该键始终在地图上。

    ImmutableMap<String, Object> immutableMap =  doSomethingAndGetImmutableMap();
    
    // convert to mutable
    Map<String, Object>  newMutableMap =  ??

    newMutableMap.remove("pin");
   
    // other code

是否有任何内置方法可以将不可变转换为可变地图java?我看到有几种方法可以做相反的事情,但不是从不可变到可变的地图。

我使用了 Maps.newHashMap,但它是最好和最有效的方法吗?

爪哇岛 弹簧启动 字典 不变性 可变

评论

0赞 Stephen C 1/14/2022
您可能需要复制不可变的地图;例如,new HashMap(immutableMap)。但是你说的是哪个界面?Java SE 中没有......或春天。你说的是番石榴吗?ImmutableMap
0赞 oescc 1/14/2022
SpringBoot 中的 ImmutableCollections$Map。
0赞 Stephen C 1/14/2022
这似乎不是SpringBoot类。请提供完整的班级名称,以便我们确定我们知道您的要求。

答:

3赞 Stephen C 1/14/2022 #1

您可以使用 copy 构造函数从现有构造函数简单地创建一个新的。HashMapMap

 HashMap<String, Object> = new HashMap<>(immutableMap);

请注意,这是一个全新的对象。没有办法使不可变的地图可变。那将打破抽象。我想从概念上讲,您可以为不可变地图设计可变包装器,该包装器将更改存储在第二个(私有)地图结构中。但番石榴似乎并不支持这一点。


这是性能还是性能更高?Maps.newHashMap

番石榴只是返回.该调用将由 JIT 编译内联,因此,一旦代码被 JIT 编译,现代 JVM 上的性能差异应该为零。Maps.newHashMap(map)new HashMap<>(map)

你几乎肯定是在浪费你的时间微优化这些东西:

  • 您应该首先设计和编写应用程序代码并使其工作。
  • 然后你对它进行基准测试。
  • 然后,您可以根据基准测试结果来决定应用程序是否需要优化。
  • 然后,对其进行分析以确定性能热点的位置。
  • 然后优化性能热点。

除非有非常奇怪的事情,否则遵循上述程序将导致您不会浪费时间问这个问题。套用 1 唐纳德·克努斯Donald Knuth) 的话:

“过早优化是万恶之源”


1 ...并过度简化/断章取义......

评论

0赞 oescc 1/14/2022
这是 Maps.newHashMap 的性能更高吗?