2

我有一个用例,我想使用 opaque byte[] 作为 MapDb 的键。我发现了这一点——使用字节数组作为映射键——限制很快;并想知道推荐哪种方法。

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

我希望 MapDB 的核心开发人员之一可以对此或ByteBufferJVM 专家进行权衡。

4

2 回答 2

5

MapDB作者在这里。

可以在没有包装器的情况下使用 byte[]。有 Hasher 处理 HTreeMap 的 hashCode 和 equals 方法:

    Map map = db.createHashMap("map")
            .hasher(Hasher.BYTE_ARRAY)
            .keySerializer(Serializer.BYTE_ARRAY)
            .makeOrGet();
于 2013-12-19T09:48:05.077 回答
0

实际上,我看不出链接答案中建议的方法有什么问题。他们说您必须将字节数组包装到具有可预测且一致hashCode()equals()实现的类中。有人建议使用Stringor 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() 构建您的版本,以更好地满足您的需求。

于 2013-12-19T02:12:02.147 回答