2010-04-28 60 views
4

鑑於這一:實施例,等於和哈希代碼在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 

這裏==是給每個對象的假但爲每個字符串對象的哈希碼是相同。爲什麼這樣?

回答

8

==確實比較對象(我的意思是 - 兩個引用指向同一個對象)的真正的平等,而不是他們的內容,而.equal比較(至少對於字符串)的內容。

String a = new String("aa"); 
String b = new String("aa"); 

ab都指向不同的對象。

還要注意的是,如果對象是相等的,那麼他們的hashchodes必須是相同的,但如果哈希碼是相同的,但這並不意味着該對象是相等的。

0

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

7

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

public int hashCode() 
{ 
    return 42; 
} 

它會履行合同。只是希望散列碼與對象的值相關,以便使散列表更有效地工作。現在

,至於爲什麼你==不工作,兩個對象將始終按引用進行比較。也就是說,如果o1 == o2,那麼o1o2是完全相同的對象。這很少是你想要的;你通常想看看是否o1.equals(o2)

+0

+1用於實際回答被問到的問題 – 2010-04-28 18:19:33

3

當您使用==,如果兩個變量保存引用同一個對象你比較。換句話說s1 == s2就像問:是s1s2變量引用了相同的String對象嗎?即使兩個String對象具有相同的「abc」值,情況也是如此。

當您使用equals()方法,你比較兩個對象的值。兩個對象可能不一樣,但它們的值(在本例中爲「abc」)是相同的,所以它返回true

如何定義對象是否與另一個對象相等?這取決於你。在這種情況下,String對象已經爲你定義了這個,但是例如如果你定義了一個Person對象,你怎麼知道一個人P1是否等於P2?你可以通過重寫equals()hashCode()來實現。