2013-03-18 146 views
0

哈希碼值爲什麼相同?哈希碼值相同

public static void main(String args[]) 
{ 
    String s1="abc"; 
    String s2=new String("abc"); 
    System.out.println("Hashcode s1-:"+ s1.hashCode()); 
    System.out.println("Hashcode s2-:"+ s2.hashCode()); 
    if(s1==s2){ 
     System.out.println("==true:"); 
    } 
} 

輸出

Hashcode s1-:96354 
Hashcode s2-:96354 
+1

因爲字符串是相同的。 – 2013-03-18 09:27:51

+0

在這裏看到更多的信息http://stackoverflow.com/questions/785091/consistency-of-hashcode-on-a-java-string – 2013-03-18 09:28:34

+0

@Sudhanshu他呼籲新的String,所以他們不是指同一個對象,因此,爲什麼==返回false。 – DaveJohnston 2013-03-18 09:29:37

回答

7

爲兩個相等的對象的哈希碼應該相等。

在這種情況下,對象是字符串,它們被認爲是相等的,因爲它們保持相同的字符序列「abc」。

如果你想要一個基於對象身份而不是相等的哈希碼,請使用System.identityHashCode()

+1

我認爲他的困惑在於他對'=='的測試返回false。 – DaveJohnston 2013-03-18 09:31:39

+0

感謝您的寶貴答案 – 2013-03-18 09:36:05

+0

@DaveJohnston你是對的,請幫我 – 2013-03-18 09:40:29

3

爲什麼他們不一樣? hashcode是根據字符串的內容計算的,因此它們對於兩者都是相同的。

==比較對象引用,並且因爲您使用new String而不是s2引用是不相同的。

您應該使用equals方法根據字符串的值測試字符串的相等性。

0

這是代碼...因此結果是兩個相同的等於對象:

public int hashCode() { 
int h = hash; 
    int len = count; 
if (h == 0 && len > 0) { 
    int off = offset; 
    char val[] = value; 

     for (int i = 0; i < len; i++) { 
      h = 31*h + val[off++]; 
     } 
     hash = h; 
    } 
    return h; 
} 
2

由於哈希碼使用這需要在只存在於字符串中的字符的公式計算。 String中的相同字符將產生相同的哈希碼

Javadoc爲計算公式。

0

根據規則,這些equals方法的對象返回true,應該具有相同的哈希碼。

的字符串
0

Hashcode方法是基於它的字符來計算,所以是equals()

它被計算爲

s[0]*31^(n-1) + s[1]*31^(n-2) + ... + s[n-1] 

其中s [i]是每個字符爲0<=i<n和n是其長度。

你的字符串都有相同的內容,因此哈希碼是相同的。

0

String class擁有自己的hashcode方法在裏面實現。其方法將計算哈希碼爲:s[0]*31^(n-1) + s[1]*31^(n-2) + ... + s[n-1]

因此對於相同的字符序列哈希碼將是相同的。

0

的JVM不創建一個新的字符串,如果這個已經存在,它只是返回的參考。當您嘗試更改其中一個變量中的實際字符串時,將會創建一個新字符串。 你可以檢查它調試應用程序,String對象將有不同的內存地址,但裏面的值將具有完全相同的內存地址。