2013-03-30 42 views
2

這裏是Java中的構造函數String對象之一:請給我解釋一下Java中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; 
} 

的代碼行,如果(originalValue.length>大小)是我關心的,我不認爲這種情況可能是對於正在執行的IF內的所有代碼,都爲true。字符串實際上是一個字符數組。 original.count應該等於它的值的長度(它的值是一個字符數組),所以條件不會發生。

我可能是錯的,所以我需要你的解釋。謝謝你的幫助。

VipHaLong。

+0

http:// stackoverflow。com/questions/12907986/how-could-originalvalue-length-size-happen-in-the-string-constructor?rq = 1 – Mob

回答

9

字符串爲INFACT字符

數組不,這不是。這是一個內部有參考到一個字符數組的對象。

original.count應等於其值的長度(其值是字符數組)

不一定。它取決於您正在查看的Java的確切版本,但直到最近幾個字符串可能指向相同的char[],每個字符串使用陣列的不同部分。

例如,如果您有:

String longString = "this is a long string"; 
String shortString = longString.substring(0, 2); 

...簡稱shortString對象將使用相同的char[]原始字符串提及,但與開始偏移量爲0,並計數2所以,如果你那時叫:

String copyOfShortString = new String(shortString); 

,確實會進入if塊,你擔心你的問題。

從Java 7 update 5開始,Oracle JRE已更改爲使substring始終爲副本。 (這背後的優點和缺點可能會變得相當複雜,但值得注意的是這兩個系統。)

看起來您正在查看的代碼版本是舊版本,其中字符串對象可以共享底層數組但查看不同的部分。

+0

謝謝,現在我明白了。我使用的是Netbeans 7.1,我認爲它甚至會爲我更新所有的JDK,所以我想我正在使用最新版本的JDK。我希望我可以接受你所有的答案,但這是stackoverflow,而不是codeproject,對不起誰也幫助了我。 –

3

您正在查看的String實現在創建子字符串時不會複製字符數據。相反,多個String對象可以引用相同的字符數組,但具有不同的offsetcount(因此也可以是length)。

因此,if條件實際上可以是真實的。

請注意,最近版本的Oracle JDK中刪除了字符數組的共享。

+0

我不明白爲什麼這個答案沒有更多的upvoted。盡我所能,不管怎樣...... :-)喬恩的*也是*不錯的,但這並不影響這一點。 –

+0

我也投票NPE和喬恩Skeet,實際上,這個答案對我來說已經足夠了(我不是很新的編程,Jon Skeet的答案是一個新手),但我只能接受1,我希望這將來可以改變。謝謝!!! –

+0

@KingKing:我不確定你的意思是我的答案是「爲新手提供的東西」 - 我不認爲它是一個面向新手的答案,因爲你已經在查看String的內部。 –