Java 在数组中重用哈希映射

Java 在数组中重用哈希映射,java,performance,Java,Performance,我持有一个hashmaps数组,我希望获得最大的性能和内存使用率,因此我希望在数组中重新使用hashmaps 因此,当数组中存在不再需要的hashmap时,我想向数组中添加新的hashmap,我只需清除hashmap并使用put()添加新值 当我从数组中退出hashmap时,我还需要复制回值 我不确定这是否比每次创建新HashMap()更好。 什么更好 更新 需要循环大约5000万个哈希映射,每个哈希映射大约有10个键值对。如果数组大小为20000,我只需要20000个hashmaps而不是50

我持有一个hashmaps数组,我希望获得最大的性能和内存使用率,因此我希望在数组中重新使用hashmaps

因此,当数组中存在不再需要的hashmap时,我想向数组中添加新的hashmap,我只需清除hashmap并使用put()添加新值

当我从数组中退出hashmap时,我还需要复制回值

我不确定这是否比每次创建
新HashMap()
更好。 什么更好

更新


需要循环大约5000万个哈希映射,每个哈希映射大约有10个键值对。如果数组大小为20000,我只需要20000个hashmaps而不是5000万个新的hashmaps()

没关系。过早优化。当您的探查器结果告诉您实际在哪里花费了最多的内存或CPU周期时,请回来查看

完全不清楚为什么以这种方式重新使用映射会提高性能和/或内存使用率。据我们所知,这可能没有什么区别,或者可能产生相反的效果


您应该尽一切努力生成可读性最高的代码,然后进行评测,最后优化评测器突出显示为瓶颈的代码部分。

使用这种方法时要非常小心。虽然循环使用对象可能会更好地提高性能,但多次修改同一引用可能会带来麻烦,如以下示例所示:

public class A {
    public int counter = 0;

    public static void main(String[] args) {

         A a = new A();
         a.counter = 5;
         A b = a; // I want to save a into b and then recycle a for other purposes
         a.counter = 10; // now b.counter is also 10
    }
}

我相信你明白了,但是如果你没有从数组中复制对HashMaps的引用,那么应该没问题。

在大多数情况下,你不会感觉到任何不同

通常,贴图条目的数量远高于贴图对象的数量。当您填充map时,您将为每个条目创建
map.Entry
的实例。这是一个相对较轻的对象,但无论如何都要调用
new
。没有数据的地图本身也是轻量级的,因此,除非你的地图应该包含1-2个条目,否则这些技巧不会给你带来任何好处

底线。
忘了提前成熟的优化吧。实现您的应用程序。如果您在评测应用程序时遇到性能问题,请找到瓶颈并加以解决。我可以99%保证瓶颈永远不会出现在
newhashmap()调用中

我认为您需要的是一种对象池类型的东西,从对象池中获取一个对象(在您的例子中是它的HashMap),执行您的操作,如果不再需要该对象,则将其放回池中

检查对象池设计模式,如需进一步参考,请检查此链接:


您遇到的问题是,大多数对象都是HashMap中的Map.Entry对象。虽然可以回收HashMap本身(及其数组),但这些只是对象的一小部分。解决这一问题的一种方法是使用javolution提供的FastMap,它可以回收所有东西,并支持管理生命周期(其目的是通过这种方式最大限度地减少垃圾)


我认为最有效的方法是使用EnumMap(如果您知道键属性)或POJO,即使大多数字段都没有使用。

重用
HashMap
s存在一些问题

  • 即使键和值数据不占用内存(从其他地方共享),Map.Entry
对象也将主导内存使用,但不会被重用(除非您做了一些特殊的事情)
  • 由于分代GC,通常让旧对象指向新对象是昂贵的(并且相对难以看到发生了什么)。如果你保存了数百万个这样的东西,这可能不是个问题
  • 更复杂的代码更难优化。因此,保持简单,然后进行大的优化,这可能涉及改变数据结构

  • 我要告诉你:我需要循环大约5000万个哈希映射,每个哈希映射大约有10对。如果数组大小为20000,我只需要20000个hashmaps,而不是5000万个new hashmaps(),除非你告诉我们你将对数据/数组/hashmaps/无论什么进行什么操作,否则你的问题无法回答。因此你要求我们猜测你将要编写的代码,然后猜测你将要输入其中的数据,最后通过思维实验来分析假设的代码?