2014-01-23 2 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 означает, что вместо того, чтобы создавая новый объект, создает ссылку на постоянный литеральный пул и выталкивает его в стек.

Создан новый объект, new и dup команды происходят до ldC#index. Но в этом вопросе How many String object..?, второй ответ говорит, что ldC#index подразумевает, что объект строки был создан, объяснение выглядит следующим образом:

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» означает, что объект создан и связан с ссылкой из пула, но он не означает, что был создан «новый» объект?

ответ

5
String s="abcd"; 

Строка из буквального "ABCD" создан в Струнный бассейне.

String s1=new String("efgh"); 

Строка из букв "efgh" создана в String pool. Новый без интернированы Строка создается, содержимое строки в пуле копируется в него

s.concat("ijkl"); 

строки из буквального «IJKL» создается в строке пула. Создана новая неинтерминированная строка, содержимое двух внутренних строк, скопированных в нее.

Это создало 3 экземпляра String в пуле и 2 неинтерминированных (не в пуле) экземплярах String.

Изменить, чтобы добавить:lcd байткодом оп толкает ссылку (значение) в String в бассейне в стек.

+0

так, сколько объектов у меня есть, в конце концов, 2 или 3 или 5? – shortCircuit

+1

Erm, в прошлый раз я посмотрел, 3 + 2 = ** 5 ** :) –

+0

ok. спасибо за ответ. – shortCircuit

2

В первой строке в пуле строк создается новая строка «abcd». Строковый объект «s» получает ссылку на эту строку. Во второй строке создается строка «efgh» в пуле строк и создается новый объект типа String «s1», и ему дается ссылка на новую строку, созданную в пуле. В третьей строке создается еще одна строка «ijkl» в пуле строк, после операции concat() создается еще одна новая строка «abcdijkl», и теперь объект String «s» относится к этой вновь созданной строке. Итак, 3 объекта в пуле строк и 2 в куче.

1

Я думаю, что реальная вещь здесь это:

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

Я понимаю, что моя основная проблема связана с первой и последней строками. если из-за этих утверждений были созданы новые объекты. Г-н @Brian предоставил ответ. – shortCircuit

Смежные вопросы