2014-06-13 47 views
-1

爲什麼hashCode的價值是相同的,而所有不同String對象:爲什麼hashCode的價值是相同的,而所有不同String對象

public class StringObj { 

    public static void main(String[] args) { 

     String s1="Jack"; 

     String s2=new String("Jack"); 

     String s3=new String("Jack"); 

     System.out.println(s1.hashCode()); 

     System.out.println(s2.hashCode()); 

     System.out.println(s3.hashCode()); 

    } 

} 
+3

[Java文檔](http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html#hashCode()):**如果兩個對象根據equals (Object)方法,然後對這兩個對象中的每一個調用hashCode方法必須產生相同的整數結果。** – BackSlash

回答

5

Java的documentation爲對象說,如果一個對象equals()另外,它必須具有相同的hashCode()。這是有道理的,因爲兩個對象據說代表着同一件事。

從實際的角度來看,這是非常重要的。它允許您使用衆所周知的字符串來寫入和讀取地圖,而不必使用單例對象鍵。

1

簡短的回答:

hashCodeequals合同明確地說,這兩個對象的hashcode()應該是相同的,如果equals回報true他們。

請注意,等於這些字符串將返回true。所以有必要hashCode是一樣的。


長的答案

contract of hashCode說:

hashCode的一般合同是:

  • 每當在執行Java應用程序期間,它會在同一個對象上被調用多次,但hashCode方法必須始終返回相同的整數,前提是在對象的equals比較中沒有使用的信息被修改。該整數不需要從應用程序的一個執行 到同一應用程序的另一個執行保持一致。

  • 如果 兩個對象根據equals(Object)方法是相等的,然後 調用每個兩個對象的hashCode方法必須產生 相同的整數結果。

  • 不要求,如果兩個對象根據equals(java.lang.Object)方法是 不等,則調用 的hashCode方法在各兩個對象的必須產生不同 整數結果。但是,程序員應該知道, 爲不相等的對象生成不同的整數結果可能會提高散列表的性能。

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

    使用int算術,其中s[i]是 串的i個字符,n是字符串的長度,以及:

hashCode of String作爲計算^表示 指數。 (空字符串的哈希值是零。)

左右,String THE hashCode()使用String的值來計算hashCode。許多對象都這樣做。所以只要內容相同,hashCode將是相同的。這是因爲這是合同規定的要求。

相關問題