我有一个用例,我想使用opaque byte []作为MapDb的键。我很快发现了这个 - Using a byte array as Map key - 限制;并想知道推荐哪种方法。
我宁愿不创建一堆临时对象和序列化开销,但似乎ByteBuffer.wrap(my_bytes)
是Java指向我的地方。
我希望MapDB的一个核心开发人员能够在这个或ByteBuffer
JVM专家身上发挥作用。
答案 0 :(得分:5)
MapDB作者在这里。
可以使用没有包装器的byte []。 Hasher处理hashCode并且等于HTreeMap的方法:
Map map = db.createHashMap("map")
.hasher(Hasher.BYTE_ARRAY)
.keySerializer(Serializer.BYTE_ARRAY)
.makeOrGet();
答案 1 :(得分:0)
实际上,我看不出链接答案中建议的方法有什么问题。他们说你必须将你的字节数组包装成一个具有可预测和一致的hashCode()
和equals()
实现的类。有人建议使用String
或ByteBuffer
,但这肯定是一个黑客,可能会在某些时候搞砸。这个简单的包装器可能就足够了(请注意,我对输入字节进行了防御性复制,以防止将改变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
类中的util,但您可以使用优化的hashCode()和equals()来构建您的版本,以更好地满足您的需求。