2013-12-19 99 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'跟踪基本消费不需要的一些字段。 –

相关问题