java - 使用字节数组作为 Map 键

标签 java hashmap bytearray

您认为使用字节数组作为 Map 键有什么问题吗?我也可以执行 new String(byte[]) 并通过 String 进行散列,但使用 byte[] 更直接。

最佳答案

只要您只希望键的引用相等就可以了 - 数组不会以您可能想要的方式实现“值相等”。例如:

byte[] array1 = new byte[1];
byte[] array2 = new byte[1];

System.out.println(array1.equals(array2));
System.out.println(array1.hashCode());
System.out.println(array2.hashCode());

打印类似:

false
1671711
11394033

(实际数字无关紧要;它们不同的事实很重要。)

假设您实际上想要相等,我建议您创建自己的包装器,其中包含 byte[] 并适本地实现相等和哈希码生成:

public final class ByteArrayWrapper
{
    private final byte[] data;

    public ByteArrayWrapper(byte[] data)
    {
        if (data == null)
        {
            throw new NullPointerException();
        }
        this.data = data;
    }

    @Override
    public boolean equals(Object other)
    {
        if (!(other instanceof ByteArrayWrapper))
        {
            return false;
        }
        return Arrays.equals(data, ((ByteArrayWrapper)other).data);
    }

    @Override
    public int hashCode()
    {
        return Arrays.hashCode(data);
    }
}

请注意,如果您在使用 ByteArrayWrapper 后更改字节数组中的值,作为 HashMap (等)中的键,您将无法查找再次键...如果您愿意,您可以在 ByteArrayWrapper 构造函数中获取数据的副本,但如果您知道自己不会,这显然会浪费性能> 正在改变字节数组的内容。

编辑:正如评论中提到的,您也可以为此使用 ByteBuffer (特别是它的 ByteBuffer#wrap(byte[]) 方法)。我不知道这是否真的是正确的事情,考虑到 ByteBuffer 所具有的所有你不需要的额外能力,但这是一种选择。

关于java - 使用字节数组作为 Map 键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1058149/

相关文章:

java - 如何从 Java 运行 Mac OS 终端命令(使用运行时?)

java - 向程序添加列表选择监听器时卡住了

java - Chromedriver 在 selenium web 驱动程序中打开一个空白页面而不是目标网站

java - 如何根据对象的属性对对象进行排序?

c# - GetBytes 函数如何工作?

python - 从 bytearray 转换为 bytes 会产生一个副本吗?

java - OSGi 中的 JSP : How to load TLD from bundles?

hashmap - Go 中映射的内存开销

python - sparse_hash_map 对于特定数据非常慢

java - 在另一个字节数组中查找一个字节数组的 indexOf