如果散列表/散列表只包含对象引用和int的内存,它会使用大量内存吗?哈希表使用多少内存?
至于一个学校项目,我们必须将数据库映射到对象(这就是现在orm/hibernate所做的),但渴望找到一种不存储id的对象以便再次保存它们的好方法,我们认为把我们创建的所有对象放在hashmap/hashtable中,这样我们就可以轻松地检索它的ID。我的问题是,如果这会花费我的表现,在我看来更优雅的方式来解决这个问题。
如果散列表/散列表只包含对象引用和int的内存,它会使用大量内存吗?哈希表使用多少内存?
至于一个学校项目,我们必须将数据库映射到对象(这就是现在orm/hibernate所做的),但渴望找到一种不存储id的对象以便再次保存它们的好方法,我们认为把我们创建的所有对象放在hashmap/hashtable中,这样我们就可以轻松地检索它的ID。我的问题是,如果这会花费我的表现,在我看来更优雅的方式来解决这个问题。
会一个Hashtable/HashMap中使用大量的内存 如果只包含对象的引用 和INT的?
“很多”取决于你有多少物体。几百或几千,你不会注意到。
但通常默认的Java集合真的令人难以置信的低效率,当您与原语的工作(因为不断拳击/从拆箱“原语包装”正在进行,如说“诠释为整型”) ,无论是从表演还是记忆的角度来看(这两者是相关的,但并不相同)。
如果你有条目很多,像几十万或几百万,我建议使用例如特罗韦集合。
在你的情况,你会使用这样的:
TIntObjectHashMap<SomeJavaClass>
或本:
TObjectIntHashMap<SomeJavaClass>
在任何情况下,不得乱跑圈默认Java集合穿孔 - 明智和CPU-明智的(并且它会引发更少的GC等)。
你在躲避不必要的从/到int/Integer的自动(un)装箱,集合创造出更少的垃圾,以更聪明的方式调整大小等等。
甚至不要让我开始默认的Java HashMap<Integer,Integer>
相比特罗韦的TIntIntHashMap
或者我会去berzerk;)
Trove系列+1。 – raffian 2013-06-04 23:52:49
没有一些数字就不可能回答这个问题。您想要存储多少个物体?不要忘记你已经存储了对象,所以键/对象引用组合应该相当小。
唯一明智的做法是尝试这一点,看看它是否适合你。不要忘记,JVM将有一个默认的最大内存分配,你可以通过-Xmx
增加这个(如果你需要的话),最简单的方法是,你需要实现Map.Entry接口,引用关键对象,对值对象的引用。如果键或值是原始类型,如int
,则需要包装类型(例如Integer
)以包装它。 Map.Entrys存储在一个数组中,并以块的形式分配。
查看this question了解更多关于如何测量Java内存消耗的信息。
@迈克尔:如果点是使用int(或长期)ID具有躲闪对象创建,然后看到我的答案:* Trove *是**绝对**你在找什么:) – SyntaxT3rr0r 2010-05-05 22:16:38
它实际上比这更复杂,我上面解释的可能是不够的。我们还没有学会使用像hibernate和对象数据库这样的工具,所以我们要编写我们自己的数据层(这非常非...非泛型,IMO),我们不想将数据库的所有ID保存在我们的对象中(为了能够以保存它们)。所以现在用Trove的Map