我有一个用例,我想使用 opaque byte[] 作为 MapDb 的键。我发现了这一点——使用字节数组作为映射键——限制很快;并想知道推荐哪种方法。
我宁愿不创建一堆临时对象和序列化开销,但这似乎ByteBuffer.wrap(my_bytes)
是 Java 指向我的地方。
我希望 MapDB 的核心开发人员之一可以对此或ByteBuffer
JVM 专家进行权衡。
我有一个用例,我想使用 opaque byte[] 作为 MapDb 的键。我发现了这一点——使用字节数组作为映射键——限制很快;并想知道推荐哪种方法。
我宁愿不创建一堆临时对象和序列化开销,但这似乎ByteBuffer.wrap(my_bytes)
是 Java 指向我的地方。
我希望 MapDB 的核心开发人员之一可以对此或ByteBuffer
JVM 专家进行权衡。
MapDB作者在这里。
可以在没有包装器的情况下使用 byte[]。有 Hasher 处理 HTreeMap 的 hashCode 和 equals 方法:
Map map = db.createHashMap("map")
.hasher(Hasher.BYTE_ARRAY)
.keySerializer(Serializer.BYTE_ARRAY)
.makeOrGet();
实际上,我看不出链接答案中建议的方法有什么问题。他们说您必须将字节数组包装到具有可预测且一致hashCode()
的equals()
实现的类中。有人建议使用String
or 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
类中的实用程序,但您当然可以使用优化的 hashCode() 和 equals() 构建您的版本,以更好地满足您的需求。