Java 如何在MapDB中将字节数组用作键

Java 如何在MapDB中将字节数组用作键,java,mapdb,Java,Mapdb,我有一个用例,我想使用不透明字节[]作为MapDb的键。我很快发现了这一点;不知道推荐哪种方法 我不希望创建一堆临时对象和序列化开销,但似乎ByteBuffer.wrap(my_bytes)是Java指向我的地方 我希望MapDB的核心开发者之一能够参与进来,或者成为一位ByteBufferJVM大师。事实上,我看不出链接答案中建议的方法有任何错误。他们说,必须将字节数组封装到具有可预测且一致的hashCode()和equals()实现的类中。有人建议使用String或ByteBuffer,但这

我有一个用例,我想使用不透明字节[]作为MapDb的键。我很快发现了这一点;不知道推荐哪种方法

我不希望创建一堆临时对象和序列化开销,但似乎
ByteBuffer.wrap(my_bytes)
是Java指向我的地方


我希望MapDB的核心开发者之一能够参与进来,或者成为一位
ByteBuffer
JVM大师。

事实上,我看不出链接答案中建议的方法有任何错误。他们说,必须将字节数组封装到具有可预测且一致的
hashCode()
equals()
实现的类中。有人建议使用
String
ByteBuffer
,但这肯定是一种黑客行为,可能会在某个时候出错。这个简单的包装器可能就足够了(请注意,我制作了一个输入字节的防御性副本,以防止修改将改变
hashCode()
equals()
计算:映射中的键必须是不可变的):

类HashtableByteArray{
私有最终字节[]数据;
公共哈希表字节数组(字节[]数据){
this.data=Arrays.copyOf(data,data.length);
}
公共int hashCode(){
返回数组。哈希代码(数据);
}
公共布尔等于(对象其他){
返回HashtableByteArray的其他实例
&&等于(数据,((HashtableByteArray)其他).data);
}
}
此示例在很大程度上依赖于类中的UTIL,但您当然可以使用优化的hashCode()和equals()构建您的版本,以更好地满足您的需要。

MapDB作者在此

可以在不使用包装器的情况下使用字节[]。有一个Hasher可以处理hashCode和HTreeMap的equals方法:

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

在一般情况下,这是一个很好的建议。现在已经阅读了
ByteBuffer
的代码,这个实现的开销是所有包装解决方案中最低的
ByteBuffer
跟踪一些基本消费不需要的字段。我知道这是旧的,但供将来参考:
Hasher
不再存在,但我相信
序列化程序。字节数组
将自动处理此问题。如果我错了,我就让简纠正。