簡體   English   中英

equals()和hashCode()之間的區別

[英]difference between equals() and hashCode()

我想要一個關於equals(),“==”和hashCode()的簡短定義。 如果我運行以下代碼意味着輸出將是“true false 2420395 2420395”。 但我明白equals()方法比較字符串和“==”比較引用。 但是在輸出中,hashCcode()方法將兩個字符串的引用號打印為相同,然后“==”返回“false”。

            String str = "Name";
    String str1 = new String("Name");

    if(str.equals(str1))
        System.out.println("true");
    else
        System.out.println("false");
    if(str==str1)
        System.out.println("true");
    else
        System.out.println("false");

    System.out.println(str.hashCode());
    System.out.println(str1.hashCode());
}

當將實現這兩​​種方法的對象添加到集合時, equals()hashCode()方法被證明是非常重要的。 如果實施不當,可能會搞砸你的生活。

equals() :此方法檢查作為參數傳遞給它的某個其他對象是否等於調用此方法的對象。 如果你不理解合同,很容易錯誤地實現equals()方法。 在重寫此方法之前,需要記住以下“屬性” -

  • 自反:o1.equals(o1) - 這意味着一個對象(例如o1)應該等於它自己
  • 對稱:o1.equals(o2)if和only o2.equals(o1)
  • 傳遞:o1.equals(o2)&& o2.equals(o3)意味着o1.equals(o3)也是
  • 一致:只要o1和o2未經修改,o1.equals(o2)就會返回相同的值
  • null比較:!o1.equals(null) - 這意味着任何可實例化的對象都不等於null。 因此,如果將null作為參數傳遞給對象o1,則它應返回false。
  • 散列碼值:o1.equals(o2)表示o1.hashCode()== o2.hashCode()。 這是非常重要的。 如果定義equals()方法,則還必須定義hashCode()方法。 此外,它意味着如果你有兩個相等的對象,那么它們必須具有相同的hashCode,但反之則不然

來自java源代碼

*
* @param   obj   the reference object with which to compare.
* @return  {@code true} if this object is the same as the obj
*          argument; {@code false} otherwise.
* @see     #hashCode()
* @see     java.util.HashMap
*/
public boolean equals(Object obj) {
   return (this == obj);

}

hashCode() :此方法返回一個hashCode()值作為Integer,並且支持基於散列的java.util.Collection類,如Hashtable,HashMap,HashSet等。如果一個類重寫了equals()方法,它必須同樣實現hashCode()方法。在重寫此方法之前,您需要記住

  • 每當在執行Java程序期間多次在同一對象上調用hashCode()方法時,此方法必須始終返回相同的結果。 從程序的一次執行到同一程序的下一次執行,整數結果不需要保持一致。
  • 如果兩個對象按照equals()方法相等,則在兩個對象中的每個對象中調用hashCode()方法必須返回相同的整數結果。 因此,如果在equals()中沒有使用某個字段,則不能在hashCode()方法中使用它。

  • 如果兩個對象根據equals()方法不相等,則兩個對象中的每一個都可以返回兩個不同的整數結果或相同的整數結果(即,如果2個對象具有相同的hashCode()結果並不意味着它們是相等的,但是如果兩個對象相等,那么它們必須返回相同的hashCode()結果)。

根據java源代碼盡可能合理,java.lang.Object定義的hashCode方法確實為不同的對象返回不同的整數。 (這通常通過將對象的內部地址轉換為整數來實現)

hashCode()不返回對象的引用,而是返回以某種方式計算的對象的哈希值 ==不使用hashCode()的值比較對象,但正如您所說,通過對象引用的值來比較。

您可以閱讀hashCode文檔 簡單地說,如果(obj1.equals(obj2)true,obj1.hashCode()==obj2.hasCode()必須為true才能成為有效的實現

請注意,這並不意味着兩個不同的對象不能共享相同的哈希碼。 實際上,這個例子是該方法的有效(但可怕)實現:

class MyClass {
    public int hashCode() {return 0;}
}

.equals()比較字符串的實際內容。

“==”運算符比較兩個對象在內存中是否是相同的引用。 如果你要做str = str1; ,然后double-equals運算符將返回true因為它們指向內存中的相同引用。

hashCode()以任意方式返回對象的哈希值。 只要不以某種方式覆蓋該方法,返回的值將始終是唯一的。 如果.equals()返回true,則哈希碼應該相同。

equals()只比較字符串它不檢查字符串的引用

但'=='檢查參考和數據

在第一種情況下String str =“Name”; 只有一個對象被創建但是在

第二種情況創建了兩個對象

String str1 = new String("Name");

那么引用與兩個字符串都不相同,這意味着它返回false

  1. 正如其他人所說'=='比較參考文獻。 但是這兩種方法只是做一些可以被覆蓋的方法。
  2. 每種方法都能做到。 如果您想知道它到底是什么以及它的含義是什么,您需要閱讀文檔。
  3. 您可以以任何方式覆蓋這些方法。 但請注意,您必須遵循這兩種方法的JAVA文檔。 因為它們被其他類使用。 例如equals()是當你試圖找到一個列表和對象使用.hashCode()由Java類庫提供了一些哈希表類使用。

equals()和hashCode()是不同的方法,不應使用hashCode方法來檢查兩個對象引用是否相同。 原因: hashCode只返回Object的int值,即使兩個不同的對象也可以具有相同的hashCode整數。 hashCode()返回的值是對象的哈希碼,它是十六進制的對象的內存地址。 equals()檢查兩個對象引用是否相同。 如果兩個對象相等,則它們的hashCode必須相同,但反之則不然。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM