2014-02-23 36 views
-2

爲什麼hashcode與string對象相同?Java String pool存儲疑惑

我想了解字符串池如何工作。我經歷了很多網站,最後我現在更困惑。讓我在這裏放下疑慮。有人幫助我理解它們。

class cov { 

    public static void main(String[] args) { 
     String s = "abc"; //Object on string pool 
     System.out.println(s.hashCode()); 
     String str = new String("abc"); //This statement does two things 
     System.out.println(str.hashCode()); 


    } 
} 
+0

這個被標記爲重複的問題是一個完全不同的問題!在結束這件事之前有沒有人打擾過檢查?投票重新開放。 –

回答

3

字符串的hashCode()方法是基於它包含的字符計算的。如果兩個字符串對象包含相同的字符具有相同大小寫且順序相同,則它們將具有相同的hashCode()

+0

但其中一個存儲在字符串常量池和其他堆上? – user2723924

+0

@ user2723924:''hashCode()'方法只取決於對象的狀態,而對於表示內容的字符串。期。 –

+1

@ user2723924 java中的所有對象都在堆中。 –

3

String類有一個hashCode方法,該方法根據其內容而不是從其內存位置計算哈希代碼。所以如果兩個字符串是相同的(但不一定相等),它們將具有相同的哈希碼。

如果不是的話,一個結構,如HashSet<String>將是不可用的 - 每一個新的String會變成不是在設定的,即使已經添加了相同的字符String

1

下面是一個用於產生的hashCode

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

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

而在其他的答案的hashCode描述從字符串的內容不在它駐留的地方所生成的源代碼。例如堆棧或常量池