2010-06-02 78 views
3

可能重複:
What is the purpose of the expression 「new String(…)」 in Java?的Java String對象的創建

嗨,

1)是什麼在thers區別兩種說法:

String s1 = "abc"; 

String s1 = new String("abc") 

2)我不使用新的第一條語句,字符串對象是如何被創建

感謝

+0

重複http://stackoverflow.com/questions/390703/what-is-the-purpose-of-the-expression-new-string-in-的java – skaffman 2010-06-02 08:58:47

+1

這裏有另一個很好的答案:http://stackoverflow.com/questions/2009228/strings-are-objects-in-java-so-why-dont-we-use-new-to-create-them/2009272#2009272 – 2010-06-02 09:04:25

回答

3

在第一種情況下,編譯器知道字符串s1的值。因此,具有相同值的所有字符串將使用相同的存儲器位置:

String s1 = "abc"; 
String s2 = "abc"; 

雖然有兩個String引用(S1和S2),則在存儲器中只有一個「ABC」序列。由於編譯器完成這項工作,所以不需要new運算符。

在第二種情況下,編譯器不執行字符串值的評估。因此,該語句將生成字符串的新實例,在運行時:

String s1 = "abc"; 
String s2 = new String("abc"); 

中恆「ABC」第1行中引用相同的內存在第2行定爲「abc」,但行的淨效應2是創建一個新的String實例。

+0

So String s1 =「abc」;正在創建任何對象/實例或只分配內存 – Ajay 2010-06-02 09:11:23

+0

由於String對象是不可變的,所以兩者之間沒有區別。事實上:你可以在字符串常量中調用String方法: int stringLength =「hello」.length(); – 2010-06-02 09:20:19

3

第一個將使用將在代碼中編譯的固定字符串。第二個變體使用固定的String並通過複製字符來創建一個新的String。這實際上在內存中創建了一個新的獨立對象,並不是必需的,因爲字符串是不可變的。欲瞭解更多信息,你可以閱讀this thread

具有內化字符串的主要優點是性能更好(例如通過緩存等)。

作爲一個程序員沒有真正的上攻創造一個新的String,除非你來通過下面的例子:

String sentence = "Lorem ipsum dolor sit amet"; 
String word = sentence.substring(5); 

現在這個詞已經來了一句引用(子不復制的字符) 。這是有效的,而這個句子也被使用了,但是當這個句子被扔掉時,你會使用比需要更多的內存。在這種情況下,一個新的String可以創建:

word = new String(word); 
+0

...upvoted早 - 我懷疑,這個例子是正確的,因爲'String(String s)'構造函數不會創建一個新的char數組,但也保留了引用。完全像'substring(int a,int b)',它內部調用'new String(int start,int length,char [] chars)' – 2010-06-02 09:20:43

+0

它檢查確切的情況並創建一個新的,調整大小的數組。 – Hardcoded 2010-06-02 09:27:43

+0

當原始值比視圖長得多時,'String(String s)'構造函數會進行復制。 來自javadoc: '初始化一個新創建的{@code String}對象,以便它表示與參數相同的字符序列;換句話說,新創建的字符串是參數字符串的副本 – Marc 2010-06-02 09:30:25