[英]Example of ==, equals and hashcode in java
鑒於這種:
String s1= new String("abc");
String s2= new String("abc");
String s3 ="abc";
System.out.println(s1==s3);
System.out.println(s1==s2);
System.out.println(s1.equals(s2));
System.out.println(s1.equals(s3));
System.out.println(s1.hashCode());
System.out.println(s2.hashCode());
System.out.println(s3.hashCode());
輸出是:
false
false
true
true
96354
96354
96354
這里==
為每個對象賦予false,但每個String對象的哈希碼是相同的。 為什么會這樣?
==
確實比較對象的真實相等性(我的意思是 - 兩個引用指向同一個對象),而不是它們的內容,而.equal
比較內容(至少對於String)。
String a = new String("aa");
String b = new String("aa");
a
和b
指向不同的對象。
另請注意,如果對象相等,則它們的哈希序列必須相同,但如果哈希碼相同,則並不意味着對象相等。
equals合同說如果是o1.equals(o2)
,那么o1.hashCode() == o2.hashCode()
。 它沒有指定任何關於不等對象的哈希碼的內容。 你可以有一個類似的方法
public int hashCode()
{
return 42;
}
它履行了合同。 只是期望哈希碼與對象的值相關,以使哈希表更有效地工作。
現在,至於為什么你的==
不起作用,將始終通過引用比較兩個對象。 也就是說,如果o1 == o2
,則o1
和o2
是完全相同的對象。 這很少是你想要的; 你通常想看看是否o1.equals(o2)
。
當您使用==
,您將比較兩個變量是否保持對同一個Object的引用。 換句話說, s1 == s2
就像問: s1
和s2
變量是否引用相同的String對象? 即使兩個String對象具有相同的“abc”值,情況也是如此。
使用equals()時,您正在比較兩個對象的值。 兩個對象可能不相同,但它們的值(在本例中為“abc”)是相同的,因此它返回true
。
如何定義一個對象是否與另一個對象相等? 隨你(由你決定。 在這種情況下,String對象已經為您定義了這個,但是例如,如果您定義了Person
對象,您如何知道人P1是否等於P2? 你可以通過重寫equals()
和hashCode()
做到這一點。
==告訴你兩個變量引用是否指向內存中的同一個對象,僅此而已。 equals()
和hashCode()
都查看對象的內容,每個都使用自己的算法進行計算。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.