看起来 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;
}
}
工作正常,但我更喜欢避免使用自定义包装器或第三方库。有选择吗?