2014-01-23 37 views
6

我對編譯3行程序的答案和結果感到困惑。下面是它的操作碼沿着代碼:http://pastebin.com/B1xxAjcp如果我不是完全錯誤的,它的明顯,如何理解是否創建了新的String對象

String s="abcd"; 
String s1=new String("efgh"); 
s.concat("ijkl"); 

這些線對應於這些操作碼:

1: istore_1 
     2: ldc   #2     // String abcd 
     4: astore_2 
     5: new   #3     // class java/lang/String 
     8: dup 
     9: ldc   #4     // String efgh 
     11: invokespecial #5     // Method java/lang/String."<init> 
":(Ljava/lang/String;)V 
     14: astore_3 
     15: aload_2 
     16: ldc   #6     // String ijkl 
     18: invokevirtual #7     // Method java/lang/String.concat: 
(Ljava/lang/String;)Ljava/lang/String; 

所以我的理解ldC#index意味着,而不是創建一個新對象,創建對常量文字池的引用,並將其推送到堆棧。

創建一個新對象,newdup命令發生在ldC#index之前。但在這個問題How many String object..?,第二個回答說,ldC#index意味着String對象已經創建,其解釋是這樣的:

public static void main(java.lang.String[]); 
    Code: 
     0: ldc   #2     // String ObjectOneObjectTwo 
     2: astore_1 
     3: getstatic  #3     // Field java/lang/System.out:Ljava/io/PrintStream; 
     6: aload_1 
     7: invokevirtual #4     // Method java/io/PrintStream.println:(Ljava/lang/String;)V 
     10: return 
} 

As you see, there is only one String object, which contains "ObjectOneObjectTwo".

  • 我無法理解(也被人幫助我)我在哪裏得到了錯誤的概念?
  • `ldc#index`是否意味着一個對象被創建並且與池中的引用關聯,但是並不意味着已經創建了一個「新」對象?從字面 「ABCD」

回答

5
String s="abcd"; 

字符串在字符串池中創建。

String s1=new String("efgh"); 

在字符串池中創建字符串「efgh」。 新的非拘留字符串創建的,在游泳池字符串的內容複製到它從字面上「IJKL」

s.concat("ijkl"); 

字符串在字符串池被創建。 創建新的非實際字符串,將兩個實際字符串的內容複製到其中。

這在池中創建了String的3個實例,並且在String中創建了2個非實例(不在池中)實例。

編輯補充:lcd字節碼運算被推動池中的一個String的參考(值)壓入堆棧。

+0

那麼有多少個對象我要在結束時,2或3或5? – shortCircuit

+1

呃,上次我看了,3 + 2 = ** 5 ** :) –

+0

好的。謝謝你的回答.. – shortCircuit

2

在第一行中,在字符串池中創建了一個新字符串「abcd」。字符串對象「s」被給予對該字符串的引用。在第二行中,在字符串池中創建另一個字符串「efgh」,並創建一個類型爲字符串「s1」的新對象,併爲該對象創建新的字符串。在第三行中,在字符串池中創建另一個字符串「ijkl」,在concat()操作之後,創建另一個新字符串「abcdijkl」,現在字符串對象「s」引用這個新創建的字符串。所以,字符串池中有3個對象,堆中有2個對象。

1

我認爲這裏的真實的東西是這樣的:

String s1=new String("efgh"); //this will create TWO objects : one in the pool and one in the heap. 
+0

我明白,我的主要問題是第一行和最後一行。如果由於這些語句而創建了新對象。 @布賴恩先生提供了答案。 – shortCircuit

相關問題