1. 程式人生 > 其它 >==、equals和hashcode

==、equals和hashcode

技術標籤:JavaSEjava

==、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);
}

在這裡插入圖片描述