【发布时间】:2016-08-07 03:45:20
【问题描述】:
我将我的班级定义为:
final class Key<T extends Comparable<T>> {
private final T q;
private final T o;
public Key(T q1, T o1) {
q = q1;
o = o1;
}
@Override
public boolean equals(Object obj) {
if(obj != null && obj instanceof Key) {
Key<T> s = (Key<T>)obj;
return q.equals(s.q) && o.equals(s.o);
}
return false;
}
@Override
public int hashCode() {
return Objects.hash(q,o);
}
}
我还定义了一个数组来包含对象 key 。例如:
Object arr[] = new Object[100];
Key<String> k = new Key<>("a","b");
int h = k.hashcode();
...
arr[h+i % h] = k; //i from 1 to 10 for example
问题是 hashcode() 可以返回负值所以
arr[h+i % h] = k;
可以在数组索引之外返回错误。这就是为什么我将代码更改为(基于我对避免 hashcode() 返回负值的搜索):
@Override
public int hashCode() {
return (Objects.hash(q,o)&0x7FFFFFFF);
}
如果我这样做,hashcode() 的均匀分布是否会改变?我的意思是两个不同对象具有相同值的概率会增加还是不增加?
【问题讨论】:
-
如何将键对象创建为 Key
。它应该给编译器错误,因为类型 Key 的参数数量不正确 -
是的,我的错误。我也编辑了它。谢谢
-
你可以看看 murmur hash 有很好的分布。也不能是负值
标签: java hashcode hash-collision