2010-05-05 45 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內存消耗的信息。