2012-10-16 51 views
6

以下是字符串'originalValue.length> size'如何在String構造函數中發生?

public String(String original) { 
int size = original.count; 
char[] originalValue = original.value; 
char[] v; 
if (originalValue.length > size) { 
    // The array representing the String is bigger than the new 
    // String itself. Perhaps this constructor is being called 
    // in order to trim the baggage, so make a copy of the array. 
     int off = original.offset; 
     v = Arrays.copyOfRange(originalValue, off, off+size); 
} else { 
    // The array representing the String is the same 
    // size as the String, so no point in making a copy. 
    v = originalValue; 
} 
this.offset = 0; 
this.count = size; 
this.value = v; 
} 

的構造函數,但,我不知道怎麼會

if (originalValue.length > size) 

發生的呢?評論說'修整行李'行李是指什麼?

+3

看看這個String類的其他構造函數和方法。有沒有辦法在數組中創建一個比實際內容需要更大的分配空間的字符串? –

回答

4

看一下子串,你會看到如何發生這種情況。

String s1 = "Abcd"; String s2 = s1.substring(3)爲例。這裏s1.size()是1,但s1.value.length是4.這是因爲s1.value與s2.value相同。這是由於性能原因(子串在O(1)中運行,因爲它不需要複製原始String的內容)。

使用子字符串會導致內存泄漏。假設你有一個非常長的字符串,你只想保留一小部分。如果你只是使用子字符串,你實際上將原始字符串內容保存在內存中。做String snippet = new String(reallyLongString.substring(x,y)),可以防止浪費內存支持不再需要的大型字符數組。

另請參閱What is the purpose of the expression "new String(...)" in Java?瞭解更多解釋。

+1

在'String s1 =「abcd」; String s2 = s1.substring(3)',s1,s2實際上擁有相同的值數組'''''','b','c','d'}'。它們之間的區別是**偏移**和**計數**。 String(String.substring(...))方法可以避免嘗試獲取大字符串的子字符串時發生內存泄漏。謝謝〜 – sun

相關問題