簡體   English   中英

java中==,equals和hashcode的示例

[英]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"); 

ab指向不同的對象。

另請注意,如果對象相等,則它們的哈希序列必須相同,但如果哈希碼相同,則並不意味着對象相等。

equals合同說如果是o1.equals(o2) ,那么o1.hashCode() == o2.hashCode() 它沒有指定任何關於不等對象的哈希碼的內容。 你可以有一個類似的方法

public int hashCode()
{
    return 42;
}

它履行了合同。 只是期望哈希碼與對象的值相關,以使哈希表更有效地工作。

現在,至於為什么你的==不起作用,將始終通過引用比較兩個對象。 也就是說,如果o1 == o2 ,則o1o2是完全相同的對象。 這很少是你想要的; 你通常想看看是否o1.equals(o2)

當您使用== ,您將比較兩個變量是否保持對同一個Object的引用。 換句話說, s1 == s2就像問: s1s2變量是否引用相同的String對象? 即使兩個String對象具有相同的“abc”值,情況也是如此。

使用equals()時,您正在比較兩個對象的值。 兩個對象可能不相同,但它們的值(在本例中為“abc”)是相同的,因此它返回true

如何定義一個對象是否與另一個對象相等? 隨你(由你決定。 在這種情況下,String對象已經為您定義了這個,但是例如,如果您定義了Person對象,您如何知道人P1是否等於P2? 你可以通過重寫equals()hashCode()做到這一點。

==告訴你兩個變量引用是否指向內存中的同一個對象,僅此而已。 equals()hashCode()都查看對象的內容,每個都使用自己的算法進行計算。

暫無
暫無

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

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