在查看不同覆盖
作为一个简单的例子,请考虑以下类:
对象是两种不同类型,但生成的哈希码相同。这是一个问题吗?我应该将类作为第一个参数传递以防止冲突吗?例如,
hashCode()
的选项时,我被引导到Google的guava-libraries中的Objects.hashCode(Object[])
(javadoc)。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 中可以看到:
警告:当只提供单个对象时,返回的哈希码并不等于该对象的哈希码。
equals
方法,但却忘记了hashcode
。我不明白在这种情况下为什么HashMap<Object, Object>
会是可行的选择。你的assertFalse
是从哪里来的?我在HashMap
中找不到它。据我所知,HashMap
只使用hashCode
而不是equals
。因此,两个不同类型的对象可能会发生碰撞,这就是我对Objects.hashCode(Object[])
持谨慎态度的原因。我同意,重写hashCode
和equals
作为一对总是很重要的,但据我所知,如果两个对象具有相同的哈希码,则它们应该是相等的,反之亦然。 - John McCarthyObjects.hashCode(Object[])
来生成哈希码是完全可以的,至于性能方面,也许@Alexander可以提供更多信息。 - PremrajArrays.hashCode
的哈希分发性能,它很不错。这仅仅是关于在这里简单情况下做太多的讨论。如果您将代理到Arrays.hashCode(Object[])
,那么您至少要构建一个数组来获得性能。我的观点是,如果您的对象只有一个字段,在大多数情况下,将代理到该字段的hashCode
是可以的。 - Alexander Pogrebnyak