首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用字节数组作为映射键

使用字节数组作为映射键
EN

Stack Overflow用户
提问于 2009-06-29 13:01:37
回答 9查看 76.4K关注 0票数 81

您认为使用字节数组作为Map key有什么问题吗?我也可以通过String来做new String(byte[])和哈希,但是使用byte[]会更简单。

EN

回答 9

Stack Overflow用户

发布于 2012-12-30 08:32:15

为此,我们可以使用ByteBuffer (这基本上是带有比较器的byte[]包装器)

代码语言:javascript
运行
复制
HashMap<ByteBuffer, byte[]> kvs = new HashMap<ByteBuffer, byte[]>();
byte[] k1 = new byte[]{1,2 ,3};
byte[] k2 = new byte[]{1,2 ,3};
byte[] val = new byte[]{12,23,43,4};

kvs.put(ByteBuffer.wrap(k1), val);
System.out.println(kvs.containsKey(ByteBuffer.wrap(k2)));

将打印

代码语言:javascript
运行
复制
true
票数 47
EN

Stack Overflow用户

发布于 2011-11-12 08:11:52

您可以使用java.math.BigInteger。它有一个BigInteger(byte[] val)构造函数。它是一个引用类型,因此可以用作哈希表的键。.equals().hashCode()分别定义为整数,这意味着BigInteger与byte[]数组具有一致的等于语义。

票数 11
EN

Stack Overflow用户

发布于 2016-07-24 21:44:08

我非常惊讶的是,答案没有指出最简单的替代方案。

是的,使用HashMap是不可能的,但是没有人阻止您使用SortedMap作为替代。唯一需要做的就是编写一个比较器,它需要比较数组。它的性能不如HashMap,但如果你想要一个简单的替代方案,你可以这样做(如果你想隐藏实现,你可以用SortedMap代替Map ):

代码语言:javascript
运行
复制
 private SortedMap<int[], String>  testMap = new TreeMap<>(new ArrayComparator());

 private class ArrayComparator implements Comparator<int[]> {
    @Override
    public int compare(int[] o1, int[] o2) {
      int result = 0;
      int maxLength = Math.max(o1.length, o2.length);
      for (int index = 0; index < maxLength; index++) {
        int o1Value = index < o1.length ? o1[index] : 0;
        int o2Value = index < o2.length ? o2[index] : 0;
        int cmp     = Integer.compare(o1Value, o2Value);
        if (cmp != 0) {
          result = cmp;
          break;
        }
      }
      return result;
    }
  }

此实现可以针对其他数组进行调整,您必须知道的唯一一件事是相等的数组(=具有相等成员的相等长度)必须返回0,并且您有一个确定的顺序

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1058149

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档