JAVA hashCode和equals方法詳解
阿新 • • 發佈:2018-12-10
hashCode和equals方法都是Object基類的方法
先看一個例子
public class Studeng {
private Integer sid;
private String name;
public Integer getSid() {
return sid;
}
public void setSid(Integer sid) {
this.sid = sid;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public int hashCode() {
System.out.println("-------hashCode方法被呼叫啦--------》");
return sid;
}
@Override
public boolean equals(Object obj) {
System.out.println("-equals方法被呼叫啦--->");
return true;
}
}
public class Demo1 {
public static void main(String[] args) {
Studeng student=new Studeng();
student.setSid(121);
Studeng student2=new Studeng();
student2.setSid(121);
System.out.println(student==student2);
System.out.println("xxxxxxxxxoooooooooo" );
System.out.println(student.equals(student2));
}
}
答案是什麼呢?
false xxxxxxxxxoooooooooo -equals方法被呼叫了—> true
直接new兩個物件,直接==不會呼叫我們重寫的hashCode方法,如果是new的,肯定返回false.equals方法,如果呼叫了該方法則會呼叫被重寫的方法,返回相應的boolean值。
如果感覺如此,該文章是不是太沒意思了,是吧。
我稍作修改一下 main方法。
public static void main(String[] args) {
Studeng student=new Studeng();
student.setSid(121);
Studeng student2=new Studeng();
student2.setSid(121);
System.out.println(student==student2);
System.out.println("xxxxxxxxxoooooooooo");
System.out.println(student.equals(student2));
HashSet<Studeng> set2=new HashSet<Studeng>();
set2.add(student);
set2.add(student2);
Iterator<Studeng> it=set2.iterator();
while(it.hasNext()){
Studeng student3=it.next();
System.out.println("&&&&&&&&"+student3.getSid());
}
}
此時再判斷一下,應該輸出什麼內容:
false xxxxxxxxxoooooooooo -equals方法被呼叫了—> true 註釋:這幾個和上面的一樣,此處不再贅述
——-hashCode方法被呼叫了——–》 ——-hashCode方法被呼叫了——–》 -equals方法被呼叫了—> &&&&&&&&121
HashSet是不允許放重複物件的,這個大家都知道哦 第一次放入的時候,呼叫了hashCode方法,return了雜湊的一個整數。set第一是空,因此順利放進去了。
第二次放入另一個物件的時候,和第一個物件的sid相同。此時,會先比較兩個物件的雜湊整數是否相同,如果相同則會繼續呼叫equals方法,如果equals相同,則認為是一個物件,我就不能再加入到set集合中,如果equals也不相同,則認為不是同一個物件則可以放入set集合中。
此處就介紹到這裡,下面篇幅會介紹,String是如何重寫hashCode和equals方法的, 可以見下一篇文章