【发布时间】:2011-05-27 23:27:14
【问题描述】:
在查看覆盖 hashCode() 的不同选项时,我被定向到 Google 番石榴库 (javadoc) 中的 Objects.hashCode(Object[])。 javadoc 声明它委托给Arrays.hashCode(Object[])。在许多不同的对象类型中使用此方法是否安全?这不是很容易发生哈希冲突,还是因为容器通常只包含一种类型的对象而不太可能?
作为一个简单的例子,考虑以下类,
public class Student {
private final String name;
public Student(String name) {
this.name = name;
}
@Override
public int hashCode() {
return Objects.hashCode(name);
}
}
public class Teacher {
private final String name;
public Teacher(String name) {
this.name = name;
}
@Override
public int hashCode() {
return Objects.hashCode(name);
}
}
public class HashCodeDriver {
public static void main(String[] args) {
final String name = "moe";
Student s = new Student(name);
Teacher t = new Teacher(name);
long studentHash = s.hashCode();
long teacherHash = t.hashCode();
System.out.println("studentHash=" + studentHash + " teacherHash=" + teacherHash);
if(studentHash == teacherHash) {
System.out.println("hash codes match");
}
else {
System.out.println("hash codes don't match");
}
}
}
输出:
studentHash=108322 teacherHash=108322
hash codes match
对象是两种不同的类型,但生成相同的哈希码。这不是问题吗?我应该将类作为第一个参数传入以防止这种冲突吗?例如,
public class Student {
private final String name;
public Student(String name) {
this.name = name;
}
@Override
public int hashCode() {
return Objects.hashCode(Student.class, name);
}
}
public class Teacher {
private final String name;
public Teacher(String name) {
this.name = name;
}
@Override
public int hashCode() {
return Objects.hashCode(Teacher.class, name);
}
}
这就是为什么 javadoc 会警告只向该方法提供单个对象的原因吗?来自 javadoc,
警告:当提供单个对象时,返回的哈希码不等于该对象的哈希码。
【问题讨论】: