[英]what is the difference between == operator and equals()? (with 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()方法。 在重寫此方法之前,需要記住以下“屬性” -
來自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()方法。在重寫此方法之前,您需要記住
如果兩個對象按照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
equals()
是當你試圖找到一個列表和對象使用.hashCode()
由Java類庫提供了一些哈希表類使用。 equals()和hashCode()是不同的方法,不應使用hashCode方法來檢查兩個對象引用是否相同。 原因: hashCode只返回Object的int值,即使兩個不同的對象也可以具有相同的hashCode整數。 hashCode()返回的值是對象的哈希碼,它是十六進制的對象的內存地址。 equals()檢查兩個對象引用是否相同。 如果兩個對象相等,則它們的hashCode必須相同,但反之則不然。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.