如何在MapDB中使用字节数组作为键

时间:2013-12-19 01:02:08

标签: java mapdb

我有一个用例,我想使用opaque byte []作为MapDb的键。我很快发现了这个 - Using a byte array as Map key - 限制;并想知道推荐哪种方法。

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

我希望MapDB的一个核心开发人员能够在这个或ByteBuffer JVM专家身上发挥作用。

2 个答案:

答案 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()实现的类。有人建议使用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类中的util,但您可以使用优化的hashCode()和equals()来构建您的版本,以更好地满足您的需求。