首页  >  文章  >  使用字节数组作为 Map 键

使用字节数组作为 Map 键

王林
王林转载
2024-02-08 23:51:301059浏览

在PHP中,使用字节数组作为Map键是一种高效的方法,可以提高程序的性能和内存利用率。字节数组作为键,相比于字符串作为键,具有更快的访问速度和更少的内存消耗。通过使用字节数组作为键,可以有效地节省内存空间,特别是在处理大量数据时。此外,字节数组还可以提供更灵活的键名操作,如比较大小、截取和拼接等。总而言之,使用字节数组作为Map键是PHP开发中的一个有益技巧,可以提升程序的性能和效率。

问题内容

您发现使用字节数组作为 Map 键有什么问题吗?我还可以通过 String 执行 new String(byte[]) 和哈希,但使用 String 执行 new String(byte[]) 和哈希,但使用 byte[] 更直接。

解决方法

问题在于 byte[]equalshashcode 更直接。

解决方法hashmap

问题在于
    equalshashcode 使用对象标识,因此
  1. byte[] b1 = {1, 2, 3}
    byte[] b2 = {1, 2, 3}
    string
  2. 中不匹配。我看到三个选项:
  3. listdf12804343f5520ff3af5d9f86b34817
  4. 包装在
  5. 中,但是您必须小心编码问题(您需要确保 byte -> string -> byte 为您提供相同的字节)。hashcodeequals
  6. 使用
(内存消耗较大)。

编写自己的包装类,编写

来使用字节数组的内容。

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

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[](实际数字无关紧要;它们不同这一事实很重要。)

假设您bytearraywrapper 作为 hashmap (等)中的键后更改字节数组中的值,您将在再次查找该键时遇到问题...您可以在如果您愿意,可以使用 bytearraywrapper实际上想要相等,我建议您创建自己的包装器,其中包含 并适当地实现相等和哈希代码生成:

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 作为 bytebuffer (特别是它的 bytebuffer#wrap(byte[]) 方法)。我不知道这是否真的是正确的事情,因为 bytebuffer (等)中的键后更改字节数组中的值,您将在再次查找该键时遇到问题...您可以在如果您愿意,可以使用 bytearraywrapper 构造函数,但如果您知道您

不会🎜更改字节数组的内容,显然这会浪费性能。🎜 🎜编辑:正如评论中提到的,您还可以使用 🎜s 拥有您不需要的所有额外功能,但它是一个选项。🎜

以上是使用字节数组作为 Map 键的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文转载于:stackoverflow.com。如有侵权,请联系admin@php.cn删除