在一次測試中遇到了這題,與大家分享一下,題目如下: 有x、y兩個字符串變量, 當if (x.equals(y) == true ) 時,對兩個字符串是否存在不同的hash Code 實現,判斷是否正確? 答案:錯, 有相同的Hash Code值。 分析:題目主要是考察String 物件的存取方式,首先要先明確一下String 變數的hash Code 值是怎麼回事? String 物件在記憶體中存放的狀態是存放在哈希表中,不同的字串產生得時候都會相對應一個哈希碼,字串的hash Code是透過hashCode()方法獲得,傳回字串的哈希碼為int型。 String 物件的雜湊碼根據以下公式計算: s[0]*31^(n-1) + s[1]*31^(n-2) + ... + s[n-1] 注意:使用int 演算法,這裡s[i] 是字串的第i 個字符,n 是字串的長度,^ 表示求冪。 (空字串的雜湊值為0。)String 類型資料中的hashCode()方法是繼承了Object類別中的hashCode() 方法,其主要目的就是為了提高(java.util.Hashtable) 哈希表中的性能。 最佳化存取效率,當出現兩個相同的聲明字串時,將不會重新建立新的物件實例,而是傳回已存在的雜湊碼,傳遞給對應的參考。再介紹HashCode的常規協定,大致如下:在Java應用程式執行期間,對同一物件對次呼叫hashCode方法時,必須一致地傳回相同的整數,前提是將物件equals比較時所使用的資訊沒有被修改。從某一個應用程式的一次執行到同一個應用程式的另一次執行,該整數無需保持不變。如果根據equals(Object)方法,兩個物件是相等的,(註:例如本題就是一個典型的例子)那麼對這兩個物件中的每一個物件呼叫hashCode() 方法時,都必須產生相同的整數結果。如果根據equals(java.lang.Object)方法,兩個物件不相等,那麼對這兩個物件中的任一個物件呼叫hashCode()方法,不要求一定產生不同的整數結果。但是,在實際應用中,為不同的物件產生不同整數結果可以提高雜湊表的效能。
本文出自CSDN博客,轉載請標示出處: http://blog.csdn.net/ComputerHeart/archive/2009/12/18/5030719.aspx
-