java - 在 Java 中创建一个 HashMap 副本——什么是最有效的方法?

标签 java hashmap copy clone

我有一个 HashMap 需要复制 ~100 000 次并且副本将单独扩展。由于 100 000 个副本很多(这不是我的代码中唯一一次发生这种情况),这是目前我实现中的一个主要瓶颈(事实上,它经常发生,占用了 45% 的运行时间,并且有不幸的是没有办法限制这个数字),所以我正在寻找最有效的方法来做到这一点。

我找到了以下选项来创建 HashMap 原始文件的浅拷贝:

//1
 HashMap<T> map = (HashMap<T>) original.clone()

//2
HashMap<T> map = new HashMap<T>();
map.putAll(original);

//3
HashMap<T> map = new HashMap<T>(original);

根据您的经验,复制 HashMap 最有效的方法是什么?是否有我错过的选项(除了通过原始版本迭代,但我想这不是一个真正的选项)?

最佳答案

考虑一下您是否真的需要副本。

您说“我只需要具有相同对象的 map ,我可以在不影响其他 map 的情况下单独添加其他对象”。考虑到这一点,您可以创建 Map 的复合实现:

class MyCompositeMap<K, V> implements Map<K, V> {
  final Map<K, V> mapThatYouAddThingsTo;
  final Map<K, V> mapThatIsShared;
}

现在,您可以实现您的方法了。例如:

  • 您的 containsKey 方法可以首先检查 mapThatYouAddThingsTo 以查看 key 是否存在;如果是,它返回 mapThatYouAddThingsTo 的值。否则,它会检查 mapThatIsShared
  • put 方法只会将内容放入 mapThatYouAddThingsTo,永远不会放入 mapThatIsShared

实现有一些棘手的方面(比如在 keySet()entrySet() 中删除重复的键和值),但前提是 mapThatYouAddThingsTomapThatIsShared 小得多,您可以使用更少的内存。

关于java - 在 Java 中创建一个 HashMap 副本——什么是最有效的方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43479428/

相关文章:

java - Eclipse 的 null 检查分析是否被 JUnit 的 'fail' 混淆了?

java - Apache Hadoop 2.2 中的 org.apache.hadoop.mapreduce 导入问题

java - 动态以格式化表格式打印HashMap

java - 将 XML 文件读入 hashmap 并创建新对象

mysql - 从另一个表复制时更新行的时间戳

java - 如何修复反编译 .class 为 .java 错误

java - 关于 RESTful Java Web 服务框架的建议...

java - Java中HashMap的内部实现

在初始化程序中快速复制属性

Python - 将文件夹及其内容写入 ZipFile