如果散列表/散列映射只包含对象引用和int,那么它是否会占用大量内存?
至于学校项目,我们必须将数据库映射到对象(这就是现在由orm / hibernate完成的)但是急于找到一种不将id存储在对象中以便再次保存它们的好方法我们想到了我们在hashmap / hashtable中创建的所有对象,因此我们可以轻松地检索它的ID。我的问题是,如果使用这个会花费我的性能,在我看来更优雅的方式来解决这个问题。
答案 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