我阅读了一篇关于 Habré 的文章,以下是我的示例和信息:
我的代码:
public class Man {
private String noseSize;
private String eyesColor;
private String haircut;
private boolean scars;
private int dnaCode;
public Man(String noseSize, String eyesColor, String haircut, boolean scars, int dnaCode) {
this.noseSize = noseSize;
this.eyesColor = eyesColor;
this.haircut = haircut;
this.scars = scars;
this.dnaCode = dnaCode;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Man man = (Man) o;
return dnaCode == man.dnaCode;
}
//геттеры сеттеры и тд
首先,为避免混淆,让我们定义一些术语。相同对象是具有相同字段内容的同一类的对象。
对于同一个对象,哈希码总是相同的;
public class Test {
public static void main(String[] args) {
Man man1 = new Man("Большой", "Зеленый", "Горшок", true, 13);
Man man2 = new Man("Большой", "Зеленый", "Горшок", true, 13);
System.out.println(man1.hashCode());
}
}
好的,这里一切都正确,它重新启动多少次显示相同的哈希码,让我们继续:
如果对象相同,则哈希码相同
public class Test {
public static void main(String[] args) {
Man man1 = new Man("Большой", "Зеленый", "Горшок", true, 13);
Man man2 = new Man("Большой", "Зеленый", "Горшок", true, 13);
System.out.println(man1.hashCode() + " " + man2.hashCode());
}
}
控制台输出:1802598046 659748578
为什么这里有两个相同的哈希码?继续前行:
如果哈希码相等,则输入特征并不总是相等(碰撞)
不幸的是,目前我不知道如何获得两个相同的哈希码,所以我无法检查它。我不会介意一个例子。
如果哈希码不同,则保证对象不同;我再次回到这个哈希码不同但对象相同的示例,这就是控制台中显示的内容:
1802598046 659748578
public class Test {
public static void main(String[] args) {
Man man1 = new Man("Большой", "Зеленый", "Горшок", true, 13);
Man man2 = new Man("Большой", "Зеленый", "Горшок", true, 13);
System.out.println(man1.hashCode() + " " + man2.hashCode());
}
}
你在这里还是有点迷茫
默认情况下,为相同的
hashCode对象返回相同的值,但不为相同的对象返回。是您自己同意您希望将相同的对象视为相同的对象,为此您必须重新定义
equals并相应hashCode地,然后行为将如您正在阅读的文章中所述。如果你阅读了hashcode方法的javadoc ,你会发现通常hashcode是一个对象在堆上的地址,转换成一个整数(Integer)
考虑到这些方法 (
equals()和hashСode()) 在整个 Java 集合中用于确定对象的等价性,这一点非常重要。此外,提供一个好的函数是非常重要的hashСode(),否则可能会发生不必要的碰撞。例如,如果函数不好hashСode(),里面的对象HashMap会更多地出现在一个篮子里,这会降低该篮子中键搜索的整体HashMap性能,虽然有一个针对此的内置保护机制jdk1.8.0_131\src.zip!\java\util\HashMap.java在你的例子中
属性组成相同但实例不同的对象(如双胞胎兄弟)
如果重新定义
equals()并且hashСode()适当,那么这些对象将被视为一个对象。PS:体面的 IDE 具有帮助生成此代码的功能。
我使用IntellijIdea 社区,他们在那里做
Alt+Insert>equals() and hashCode()