将不可变映射转换为可变映射java

问题描述 投票:0回答:1

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

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

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

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

java collections immutability mutable
1个回答
3
投票

您可以使用复制构造函数从现有的

HashMap
创建一个新的
Map

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

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


这个还是

Maps.newHashMap
性能更高?

Guava

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

您几乎肯定是在浪费时间对此类内容进行微优化:

  • 您应该首先设计和编写应用程序代码并使其运行。
  • 然后你对其进行基准测试。
  • 然后您根据基准测试结果决定应用程序是否需要优化。
  • 然后对其进行分析以确定性能热点在哪里。
  • 然后优化性能热点。

除非有什么非常奇怪的事情,否则按照上述步骤就不会浪费时间问这个问题。套用1 唐纳德·高德纳 (Donald Knuth):

“过早优化是万恶之源”.


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

© www.soinside.com 2019 - 2024. All rights reserved.