==與equals 的區別,爲何重寫 equals 方法也要重寫 hashCode 方法? | 8月更文挑戰

==

  • 引用類型:== 是直接比較的兩個對象的堆內存地址,若是相等,則說明兩個引用實際是指向同一個對象地址的。java

  • 基本類型:對於 基本數據類型(8個)和 String 來講又是怎樣呢?算法

    int a = 123;
    int b = 123;
    System.out.println(a == b);	// true
    
    String s1 = "abc";
    String s2 = "abc";
    System.out.println(s1 == s2);	// true
    
    String s3 = new String("abc");
    System.out.println(s1 == s3);	// false
    複製代碼

    對於基本類型(8個)和 直接聲明的 "abc" 字符串,他們是做爲字面量存在常量池中以 HashSet 策略存儲起來的,在常量池中,一個常量只會對應一個地址,因此它們的引用都是指向的同一塊地址。數組

  • 另外,對於基本數據的包裝類型,除了Float和Double以外,其餘的六種都是實現了常量池技術,其中 Integer 在常量池中的存儲範圍爲 [-128,127] ,在這個範圍外的值,會在堆內存中建立一個新的對象保存這個值。markdown

equals

  • Object 的通用方法,在沒有重寫以前,與 == 是沒有區別的;ide

    public boolean equals(Object obj) {
            return (this == obj);
       }
    複製代碼
  • 而通常 equals 方法是須要咱們自行重寫的,String 和 基本類型封裝類就重寫了 equals,從而進行的是內容的比較;this

  • 通常實現:spa

    • public class Student {
          private String num;
          private String name;
      
          @Override
          public boolean equals(Object o) {
              if (this == o) return true;
              if (o == null || getClass() != o.getClass()) return false;
              Student student = (Student) o;
              return Objects.equals(num, student.num) &&
                      Objects.equals(name, student.name);
          }
      
          @Override
          public int hashCode() {
              return Objects.hash(num, name);
          }
      }
      複製代碼
    • 檢查是否爲同一個對象的引用,若是是直接返回 true;code

    • 檢查是否爲空,是否同一類型,爲空 或 類型不一致,返回 false;orm

    • 將 Object 對象轉型;對象

    • 判斷每一個屬性的值是否相等

hashCode

  • Object 的通用方法,hashcode是根據對象的內存地址經哈希算法得來的;
  • hashCode 方法主要是爲了給 HashMap、HashSet 等集合類使用的。
  • 一些規定:
    • 兩個對象相等,hashcode必定相等
    • 兩個對象不等,hashcode不必定不等
    • hashcode相等,兩個對象不必定相等
    • hashcode不等,兩個對象必定不等

爲何重寫 equals 方法必定要重寫 hashCode 方法?

  • 官方說法是:對象的equals方法被重寫,那麼對象的hashCode()也儘可能重寫;(主要看應用場景)
  • equals 方法 和 hashCode 方法自己並無緊密的聯繫,只是應用場景(如HashMap、HashSet等集合類的存取)使它們出如今了一塊兒,纔有了這句話;
  • 哈希集合(如HashMap)要保證元素惟一性。key對象放入集合,先通過hash運算,獲得index,找到數組對應位置,還要和此位置的對象進行比較(先用hash比較,後用equals方法),不同就插入到後面造成鏈表,同樣的話就不用插入了。重寫了equals()方法,但不重寫hashcode()方法,那可能兩個相同的對象放入到了不一樣的位置,元素的惟一性就不存在了。(HashMap存入鍵值對的方式要複雜的多,這裏只是簡要說下)
相關文章
相關標籤/搜索