2014-09-28 98 views

回答

4

這兩行代碼不會創建任何對象。字符串文字(如"a")放在string pool中,並在課程加載時可用。

如果你

String x = new String("a"); 
String y = new String("b"); 

兩個對象在運行時創建。

這些問題/答案應該包括後續問題:

+3

類加載時間在技術上仍然是運行時,因爲字符串實例是動態創建的,並且不是由編譯器靜態分配的。 – biziclop 2014-09-28 09:21:55

+0

好吧,好的:-)更新。 – aioobe 2014-09-28 09:23:42

+1

字符串池中的字符串文字被字符串對象封裝,因此問題中的兩行最終會導致創建兩個字符串對象。 – 2014-09-28 09:38:36

1

與文本字符串獲取字符串池創建。而通過新操作符的字符串則在堆內存中創建。

通過文字創建字符串的優點是,如果該字符串值已經在字符串池中可用,那麼每次創建新對象時都會通過新運算符獲得相同的引用新引用。

在你的情況下,你會得到相同的參考。所以只有對象。

4

當使用new運算符初始化字符串時,會創建新對象。 如果你這樣做

String s1 = new String(「string」);

String s2 = new String(「string」);

String s3 = new String(「string」);

所有這三個都會在堆中創建一個單獨的String對象。 而如果所有上面的字符串都是沒有new運算符的初始化,那麼首先在字符串池中檢查字符串是否存在。如果需要的字符串存在,那麼新的引用將開始指向現有的字符串。否則它會在池中創建新的字符串。例如:

String s1 =「string」;

String s2 =「string」;

String s3 =「string1」;

在上面的例子中,只有兩個字符串將在字符串池(「string」和「string1」)中創建。其中String s1和s2將引用單個對象「string」,s3將引用另一個字符串對象「string1」。

+0

在上述情況下, String s1 = new String(「string」); String s2 = new String(「string」); String s3 = new String(「string」); 是否: 將創建4個對象 - 第一個對象將在Java永久堆內存中創建,作爲我們傳遞的參數的一部分 - 「string」。它將在字符串文字池中創建。 或3個物體? – AnswerDroid 2016-09-26 12:26:22