首页 > Java > 正文

使用字节数组作为 Map 键

王林
发布: 2024-02-08 23:51:30
转载
1087人浏览过

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

问题内容

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

解决方法

问题在于 byte[] 对 equals 和 hashcode 使用对象标识,因此

byte[] b1 = {1, 2, 3}
byte[] b2 = {1, 2, 3}
登录后复制

在 hashmap 中不匹配。我看到三个选项:

  1. 包装在 string 中,但是您必须小心编码问题(您需要确保 byte -> string -> byte 为您提供相同的字节)。
  2. 使用 list (内存消耗较大)。
  3. 编写自己的包装类,编写 hashcode 和 equals 来使用字节数组的内容。

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

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[]) 方法)。我不知道这是否真的是正确的事情,因为 bytebuffers 拥有您不需要的所有额外功能,但它是一个选项。

以上就是使用字节数组作为 Map 键的详细内容,更多请关注php中文网其它相关文章!

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:stackoverflow网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号