2013-12-19 33 views
2

我有一個使用情況下,我想用不透明的byte []作爲鍵進入創建mapdb。我發現這個 - Using a byte array as Map key - 快速限制;並想知道哪種方法是推薦的。如何使用字節數組作爲鍵在創建mapdb

我寧可不創建一批臨時對象和序列化的開銷,但似乎ByteBuffer.wrap(my_bytes)就是Java的指向我。

我希望創建mapdb的核心開發者之一的重量可以在此或ByteBuffer JVM大師。

回答

5

創建mapdb筆者在這裏。

它可以使用字節[]無包裝。有Hasher處理hashcode並等於HTreeMap的方法:

Map map = db.createHashMap("map") 
      .hasher(Hasher.BYTE_ARRAY) 
      .keySerializer(Serializer.BYTE_ARRAY) 
      .makeOrGet(); 
0

其實,我看不出什麼錯在鏈接答案提出的辦法。他們說你必須將你的字節數組包裝成一些具有可預測和一致性的類別hashCode()equals()實現。有人建議使用StringByteBuffer,但這絕對是一個黑客,並可能在某個時候搞砸了。這個簡單的包裝可能就夠了(請注意,我做了輸入的防守副本字節,以防止修改,將改變hashCode()equals()計算:在地圖的關鍵必須是不可改變的)

class HashtableByteArray { 

    private final byte[] data; 

    public HashtableByteArray(byte[] data) { 
    this.data = Arrays.copyOf(data, data.length); 
    } 

    public int hashCode() { 
    return Arrays.hashCode(data); 
    } 

    public boolean equals(Object other) { 
    return other instanceof HashtableByteArray 
     && Arrays.equals(data, ((HashtableByteArray) other).data); 
    } 
} 

該樣品在很大程度上依賴於在Arrays類中使用utils,但您可以使用優化的hashCode()和equals()來構建您的版本,以更好地滿足您的需求。

+0

這是一般情況下的一個好建議。現在已經閱讀了「ByteBuffer」的代碼,這個實現在任何包裝解決方案中都具有最低的開銷。 'ByteBuffer'跟蹤基本消費不需要的一些字段。 –

相關問題