我有一個由3個字段標識的對象。一個是代表6個十六進制字節的字符串,另外兩個是不超過1個字節的整數。總結起來就是8個字節的數據,它適合於64位整數。HashMap - 使用具有多個字段的鍵快速訪問
我需要對這些對象的快速訪問地圖,我能想到的兩種方法:
使用三個字段,以產生用於對象映射64位的密鑰。然而,這意味着將字符串解析爲每個訪問的十六進制(並且會有很多訪問,這需要很快)。
使用3個HashMap級別,每個嵌套在下一個內部,表示3個標識字段。
我的問題是哪種方法應該是最快的。
我有一個由3個字段標識的對象。一個是代表6個十六進制字節的字符串,另外兩個是不超過1個字節的整數。總結起來就是8個字節的數據,它適合於64位整數。HashMap - 使用具有多個字段的鍵快速訪問
我需要對這些對象的快速訪問地圖,我能想到的兩種方法:
使用三個字段,以產生用於對象映射64位的密鑰。然而,這意味着將字符串解析爲每個訪問的十六進制(並且會有很多訪問,這需要很快)。
使用3個HashMap級別,每個嵌套在下一個內部,表示3個標識字段。
我的問題是哪種方法應該是最快的。
我有一個建議給你。 使用將形成關鍵字的3個屬性創建一個對象。使用該對象具有密鑰,因爲它將是唯一的。
Map<ObjectKey,Object> map = new HashMap<>();
這對您的用例有意義嗎?如果你可以添加更多的解釋,也許我可以進一步建議你可能的解決方案。
編輯:您可以覆蓋equals和使用這種邏輯做一些事情:
@Override
public boolean equals(Object obj) {
if (!(obj instanceof Key))
return false;
ObjectKey objectKey= (Key) obj;
return this.key1.equals(objectKey.key1) && this.key2.equals(objectKey.key2) &&
...
this.keyN.equals(objectKey.keyN)
}
這裏最主要的是你必須爲ObjectKey定義'hashCode()'和'equals()'方法。那麼你如何定義它們呢?這是OP問題的主要部分。 –
爲什麼不使用MultiKeyMap? 這可能與您的問題無關。
我將採取以下措施:
您的密鑰適合64位值。假設你將一次構建HashMap,然後多次讀取(使用它作爲查找表),我的直覺是使用Long
類型作爲你的HashMap的關鍵字將盡可能快地得到。
您擔心必須在每次在地圖中查找關鍵字時將字符串解析爲十六進制數字。有什麼選擇?如果使用包含三個單獨字段的鍵,則仍然必須解析字符串以計算其哈希碼(或者,Java API實現將通過解析字符串內容來計算其哈希碼)。 HashMap不僅會調用String.hashCode()
而且還會調用String.equals()
,所以你的字符串將被迭代兩次。相比之下,計算一個Long
並將其與HashMap中的預先計算的鍵進行比較將包含迭代該字符串一次。
如果你使用三級HashMap
,按照你的第二個建議,你仍然需要計算你的字符串的哈希碼,並且不得不查找所有三個字段的值,級別地圖不會給你任何性能優勢。
您還應該試驗HashMap構造函數參數以獲得最高效率。這些將決定您的數據如何有效地傳播到單獨的存儲桶中。
你爲什麼不簡單地嘗試兩種方法並親自看看? – klutt
我會爲關鍵字段創建一個類,將其存儲在對象中,並將其用於地圖的鍵 –
您的3個地圖會更多:它只有3個關卡,每個關卡都有多個地圖。 .. –