Я смущен ответами и результатами, которые я получаю при составлении 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» означает, что объект создан и связан с ссылкой из пула, но он не означает, что был создан «новый» объект?
так, сколько объектов у меня есть, в конце концов, 2 или 3 или 5? – shortCircuit
Erm, в прошлый раз я посмотрел, 3 + 2 = ** 5 ** :) –
ok. спасибо за ответ. – shortCircuit