2013-10-04 26 views
1

我有,我需要存儲鍵,值1(浮)和值2(很長的字符串)的地圖,其中數值1適用於所有鍵和值2的一個問題是隻有1%的鑰匙。java的空實例變量的內存佔用

我能想到的2個可能的解決方案

  1. 兩個映射像MAP1 =地圖(KEY1,地圖(KEY2,值1))和MAP2 =地圖(KEY1,地圖(KEY2,值2)) 利弊 - 沒有不必要的參考變量。缺點 - 存儲相同的密鑰兩次浪費內存。

  2. 使用一個地圖與自定義對象值。 map1 =地圖customobj {float value1;字符串值2} 優點 - 密鑰不重複。 consob 99%的customobj將有value2 = null,因此會消耗參考指針的內存。

基本上我最終的問題是確實(在customobj)未使用的引用消耗內存或將編譯器優化呢?我傾向於soln 2,因爲我不想通過存儲相同的key1和key2兩次來浪費內存。另一方面99%的時間值2 = null,這讓我想知道soln1是否更好。

我使用Java和我想聽到一些建議。

編輯:我沒有意識到SO didnt打印地圖結構我張貼,我編輯那個。既KEY1和KEY2是串(主要是固定長度的ID字符串)

+2

不成熟的優化?參考很小。 –

+2

我喜歡解決方案2.參考價格便宜。除非你有成千上萬的人,否則他們不會像第二種解決方案那麼簡單。 –

+0

鍵是固定大小的字符串。看到我上面的編輯 – srini

回答

2

我將根據密鑰大小選擇溶液,並鍵入

溶液1爲 -

1)與主要和VALUE1(浮子HashMap中)

2)HashMap的密鑰和值2(串)

這將只需要按鍵的1%的額外空間。如果密鑰大小是巨大的,那麼我會用溶液2

解決方案2走的是 -

單HashMap中有一個自定義對象。使用結構或類創建自定義對象。

雖然引用的存儲器非常小,每個對象依然佔據對象的開銷(16個字節)和填充(4個字節)的恆定存儲器。來自解決方案1的HashMap密鑰可能會佔用每個鍵值對的大約8個字節開銷。因此,如果您的密鑰大小大於整數或字符,請選擇解決方案2。

+0

自定義類我與解決方案2出於同樣的原因,重複鍵(最大20字符)字符串比參考更昂貴。我也覺得這是過早的優化,但我在這裏問這個問題是爲了讓我的設計困境成爲一個學習機會。謝謝你的回答! – srini

0

解決方案#3。 HashMap其中value是Float或CustomObj {float value1;字符串值2}。在運行時進行instanceof查找哪一個是哪個。

,假設優化甚至是一個問題。過早優化是所有邪惡的根源,對不對?如果您不確定是否還需要進行優化,那麼只需按照您對建模的真實世界進行概念化的方式進行編碼即可。