哈希表使用多少内存?

时间:2010-05-05 21:12:57

标签: java memory hashmap

如果散列表/散列映射只包含对象引用和int,那么它是否会占用大量内存?

至于学校项目,我们必须将数据库映射到对象(这就是现在由orm / hibernate完成的)但是急于找到一种不将id存储在对象中以便再次保存它们的好方法我们想到了我们在hashmap / hashtable中创建的所有对象,因此我们可以轻松地检索它的ID。我的问题是,如果使用这个会花费我的性能,在我看来更优雅的方式来解决这个问题。

3 个答案:

答案 0 :(得分:3)

  

哈希表/ hashmap会使用很多   内存,如果它只包含对象   引用和int的?

“很多”取决于你拥有多少物品。几百或几千,你不会注意到。

但是当你使用原语时,默认的Java集合通常是非常低效的(因为从“原语到包装器的持续装箱/拆箱,比如说” int to Integer“),从性能和内存的角度来看(两者相关但不相同)。

如果您有 lot 条目,例如数十万或数百万,我建议使用 Trove 集合。

在你的情况下,你会使用它:

TIntObjectHashMap<SomeJavaClass>

或者这个:

TObjectIntHashMap<SomeJavaClass>

在任何情况下,这应该围绕默认的Java集合循环和cpu-wise(它应该触发方式减少GC等)。

你正在从/向int / Integer躲避不必要的自动(un)装箱,集合正在创造更少的垃圾,以更聪明的方式调整大小等等。

甚至不让我开始使用默认的Java HashMap<Integer,Integer>,而不是Trove的TIntIntHashMap或者我会去berzerk;)

答案 1 :(得分:1)

最低限度,您需要实现Map.Entry接口,并引用键对象和对值对象的引用。如果键或值是基本类型,例如int,则需要包装类型(例如Integer)来包装它。 Map.Entrys存储在一个数组中并以块的形式分配。

有关如何使用Java测量内存消耗的更多信息,请查看this question

答案 2 :(得分:0)

如果没有一些数字,就不可能回答这个问题。你想要存储多少个物体?不要忘记你已经存储了对象,因此键/对象引用组合应该相当小。

唯一明智的做法是尝试这一点,看看它是否适合你。不要忘记JVM将具有默认的最大内存分配,您可以通过-Xmx

增加(如果需要)