2010-05-05 168 views
3

如果散列表/散列表只包含对象引用和int的内存,它会使用大量内存吗?哈希表使用多少内存?

至于一个学校项目,我们必须将数据库映射到对象(这就是现在orm/hibernate所做的),但渴望找到一种不存储id的对象以便再次保存它们的好方法,我们认为把我们创建的所有对象放在hashmap/hashtable中,这样我们就可以轻松地检索它的ID。我的问题是,如果这会花费我的表现,在我看来更优雅的方式来解决这个问题。

+0

@迈克尔:如果点是使用int(或长期)ID具有躲闪对象创建,然后看到我的答案:* Trove *是**绝对**你在找什么:) – SyntaxT3rr0r 2010-05-05 22:16:38

+0

它实际上比这更复杂,我上面解释的可能是不够的。我们还没有学会使用像hibernate和对象数据库这样的工具,所以我们要编写我们自己的数据层(这非常非...非泛型,IMO),我们不想将数据库的所有ID保存在我们的对象中(为了能够以保存它们)。所以现在用Trove的Map 我可以放入任何我创建的对象并检索它的id。 但是告诉我你的意思是避开对象创建?至少如果你想解释,但我是一个耳朵。 – Michael 2010-05-06 18:38:07

回答

3

会一个Hashtable/HashMap中使用大量的内存 如果只包含对象的引用 和INT的?

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

但通常默认的Java集合真的令人难以置信的低效率,当您与原语的工作(因为不断拳击/从拆箱“原语包装”正在进行,如说“诠释为整型”) ,无论是从表演还是记忆的角度来看(这两者是相关的,但并不相同)。

如果你有条目很多,像几十万或几百万,我建议使用例如特罗韦集合。

在你的情况,你会使用这样的:

TIntObjectHashMap<SomeJavaClass> 

或本:

TObjectIntHashMap<SomeJavaClass> 

在任何情况下,不得乱跑圈默认Java集合穿孔 - 明智和CPU-明智的(并且它会引发更少的GC等)。

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

甚至不要让我开始默认的Java HashMap<Integer,Integer>相比特罗韦的TIntIntHashMap或者我会去berzerk;)

+0

Trove系列+1。 – raffian 2013-06-04 23:52:49

0

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

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

1

增加这个(如果你需要的话),最简单的方法是,你需要实现Map.Entry接口,引用关键对象,对值对象的引用。如果键或值是原始类型,如int,则需要包装类型(例如Integer)以包装它。 Map.Entrys存储在一个数组中,并以块的形式分配。

查看this question了解更多关于如何测量Java内存消耗的信息。