[英]Implementation of hashCode and equals in int[] Java
看来int []的hashCode()和equals()实现不佳,或者根本没有实现! (已经在Android上进行了测试,但是我希望它在任何Java环境中都是正确的)。
为了使HashSet.contains()正常工作,我必须为int []创建包装器(请注意,不要批评我的编码风格,请看本质):
public class IntArray {
private int[] value;
public IntArray(int[] value) {
this.value = value;
}
@Override
public int hashCode() {
int sum = 0;
// Integer overflows are cheerfully welcome.
for (int elem: value) sum += elem;
return sum;
}
@Override
public boolean equals(Object o) {
if (o == null) return (value==null);
if (value != null) {
if (o instanceof int[])
return compare((int[])o);
if (o instanceof IntArray)
return compare(((IntArray)o).value);
}
return false;
}
protected boolean compare(int[] other) {
int len = value.length;
if (other.length != len) return false;
for (int i=0; i<len ; i++)
if (value[i] != other[i]) return false;
return true;
}
}
可以,但是我更喜欢避免使用自定义包装程序或第三方库。 有选择吗?
由于标准Java Hashtable不允许覆盖用于键的哈希码,因此您很不走运,因此需要像以前一样使用包装器。
请记住,您的hashCode实现非常糟糕,您可以使用此代码(从标准JDK中的java.util.Arrays中获取)来获得更好的哈希分配:
public static int hashCode(int a[]) {
if (a == null)
return 0;
int result = 1;
for (int element : a)
result = 31 * result + element;
return result;
}
一种替代方法是使用其他可以处理基元的哈希表。 一个这样的选项是Banana ,这是我创建的原始集合库。
在Omry Yadan发出消息之后,hashCode函数就变得如此简单!
@Override
public int hashCode() {
return Arrays.hashCode(value);
}
对于像ARM这样的RISC CPU,效率可能更高:
@Override
public int hashCode() {
int code = 0;
if (value != null) {
code++;
for (int elem: value)
code = (code<<5) - code + elem;
}
return code;
}
也许还有一个比较数组的标准函数,在这种情况下equals()也可以简化?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.