簡體   English   中英

哈希表使用多少內存?

[英]How much memory does a hashtable use?

如果hashtable / hashmap只包含對象引用和int,那么它是否會使用大量內存?

至於一個學校項目,我們必須將數據庫映射到對象(這就是現在由orm / hibernate完成的),但是急於找到一種不將id存儲在對象中以便再次保存它們的好方法我們想到放置所有對象我們在hashmap / hashtable中創建,因此我們可以輕松檢索它的ID。 我的問題是,如果用這個花費我的性能,在我看來更優雅的方式來解決這個問題。

如果hashtable / hashmap只包含對象引用和int,那么它是否會使用大量內存?

“很多”取決於你擁有多少物體。 幾百或幾千,你不會注意到。

但是,當你使用基元時,默認的Java集合實際上是非常低效的(因為從“原始到封裝”的持續裝箱/取消裝箱,比如說“int to Integer” ),從性能和內存的角度來看都是如此(兩者相關但不完全相同)。

如果您有很多條目,例如數十萬或數百萬,我建議使用例如Trove集合。

在你的情況下,你使用這個:

TIntObjectHashMap<SomeJavaClass>

或這個:

TObjectIntHashMap<SomeJavaClass>

在任何情況下,這應該圍繞默認的Java集合順行和cpu-wise(它應該觸發方式減少GC等)。

你正在從/向int / Integer避免不必要的自動(un)裝箱,集合正在創造更少的垃圾,以更智能的方式調整大小等等。

甚至不讓我開始使用默認的Java HashMap<Integer,Integer>與Trove的TIntIntHashMap相比,或者我會去berzerk;)

最低限度,您需要Map.Entry接口的實現,其中包含對鍵對象的引用和對值對象的引用。 如果鍵或值是基本類型(例如int ,則需要包裝類型(例如Integer )來包裝它。 Map.Entrys存儲在一個數組中並以塊的形式分配。

有關如何使用Java測量內存消耗的更多信息,請查看此問題

沒有一些數字,這是不可能的。 你想要存儲多少個物體? 不要忘記您已經存儲了對象,因此鍵/對象引用組合應該相當小。

唯一明智的做法是嘗試這個,看看它是否適合你。 不要忘記JVM將具有默認的最大內存分配,您可以通過-Xmx增加(如果需要)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM