==、equals和hashcode
阿新 • • 發佈:2021-01-22
==、equals和hashcode
一. == 與 equals的區別
- 在java中,==表示比較兩個物件的記憶體地址。如果對於一個物件,沒有重寫equals的話,那麼就會執行Object類裡面的equals()方法(因為所有的類都是繼承自Object)。
- 而Object類中的equals()方法是直接用==比較,也就是說如果一個類沒有重寫equals那麼其equals方法等價於
二. hashcode的作用
-
hashcode的作用主要是當我們用集合類的時候會用到比如HashMap
-
在HashMap中,比較兩個元素是否相等,首先看hashcode如果hashcode不相等那麼直接返回false,如果相等,那麼在呼叫equals
-
主要作用還是減少呼叫equals的次數,並且提高速度
三. 為什麼重寫equals必須重寫hashcode
- 實際應用場景中,儘管是兩個物件,但是其某些屬性相等我們就可以認為它們是相等的。所以需要重寫equals方法
hashcode
hashcode是一個int型別的變數,其根據記憶體地址計算出的一個hash值,只要地址不同hashcode就不同。
所以如果單純的只重寫了equals而沒有重寫hashcode就會產生如下問題
重寫equals未重寫hashCode()
public static void main(String[] args){
Person person1 = new Student("z","Maths");
Person person2 = new Student("z","Maths");
HashSet<Person> map = new HashSet<>();
map.add(person1);
map.add(person2);
System.out.println(map.size());
System.out.println(map);
}
class Student{
//略
@Override
public boolean equals(Object o){
if(this == o) return true;
if(o == null || this.getClass() != o.getClass())
return false;
Student s = (Student) o;
return Objects.equals(this.name,s.name);
}
}
儘管屬性相等,但是在hashset中卻是以兩個物件儲存。這是因為HashSet中判斷物件是否相等是根據Hashcode判斷的,儘管重寫了equals,但是沒有重寫hashcode方法所以返回的hash值還是不同,那麼就會被認為是兩個物件儲存在HashSet中
重寫equals並重寫hashCode()
@Override
public int hashCode(){
return Objects.hash(this.name);
}