在PHP中,使用字节数组作为Map键是一种高效的方法,可以提高程序的性能和内存利用率。字节数组作为键,相比于字符串作为键,具有更快的访问速度和更少的内存消耗。通过使用字节数组作为键,可以有效地节省内存空间,特别是在处理大量数据时。此外,字节数组还可以提供更灵活的键名操作,如比较大小、截取和拼接等。总而言之,使用字节数组作为Map键是PHP开发中的一个有益技巧,可以提升程序的性能和效率。
您发现使用字节数组作为 Map 键有什么问题吗?我还可以通过 String
执行 new String(byte[])
和哈希,但使用 String
执行 new String(byte[])
和哈希,但使用 byte[]
更直接。
问题在于 byte[]
对 equals
和 hashcode
更直接。
解决方法hashmap
equals
和 hashcode
使用对象标识,因此 byte[] b1 = {1, 2, 3} byte[] b2 = {1, 2, 3}
string
在 listdf12804343f5520ff3af5d9f86b34817
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[]
(实际数字无关紧要;它们不同这一事实很重要。)
假设您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
构造函数,但如果您知道您
以上是使用字节数组作为 Map 键的详细内容。更多信息请关注PHP中文网其他相关文章!