Would it create an object in the constant pool for "Tech" before concatenating? I know for the first String 2 objects would be created. One in the constant pool and another one in the heap area to which s1 would be referencing. For the second String object, s2 would be referencing to the object(concatenation result) in the heap area. But the question is, would an object for String "Tech" be created on the constant pool. Please note I had read it somewhere that all string literals in the code are allocated memory in the constant pool and this is decided during the compilation phase itself. And to verify the same, the string literals can be found in the .class file. But after compiling the below code, "Tech" is not found in the .class file.
String s1 = new String("ABC");
String s2 = s1 + "Tech";
My jdk is 1.8 and "Tech" string(#31) exsit in Constant pool of classFile
Classfile /D:/work/sentinel-1.8.0/Sentinel-1.8.0/rpc/rpc-consumer/target/test-classes/com/cpic/zuoqi/rpc/api/Test.class
Last modified 2020-10-10; size 656 bytes
MD5 checksum 23cf1e4d4960807b50ebc6e180f895ab
Compiled from "Test.java"
public class com.cpic.zuoqi.rpc.api.Test
minor version: 0
major version: 52
flags: ACC_PUBLIC, ACC_SUPER
Constant pool:
#1 = Methodref #11.#25 // java/lang/Object."<init>":()V
#2 = Class #26 // java/lang/String
#3 = String #27 // ABC
#4 = Methodref #2.#28 // java/lang/String."<init>":(Ljava/lang/String;)V
#5 = Class #29 // java/lang/StringBuilder
#6 = Methodref #5.#25 // java/lang/StringBuilder."<init>":()V
#7 = Methodref #5.#30 // java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
#8 = String #31 // Tech
#9 = Methodref #5.#32 // java/lang/StringBuilder.toString:()Ljava/lang/String;
#10 = Class #33 // com/cpic/zuoqi/rpc/api/Test
#11 = Class #34 // java/lang/Object
#12 = Utf8 <init>
#13 = Utf8 ()V
#14 = Utf8 Code
#15 = Utf8 LineNumberTable
#16 = Utf8 LocalVariableTable
#17 = Utf8 this
#18 = Utf8 Lcom/cpic/zuoqi/rpc/api/Test;
#19 = Utf8 test
#20 = Utf8 s1
#21 = Utf8 Ljava/lang/String;
#22 = Utf8 s2
#23 = Utf8 SourceFile
#24 = Utf8 Test.java
#25 = NameAndType #12:#13 // "<init>":()V
#26 = Utf8 java/lang/String
#27 = Utf8 ABC
#28 = NameAndType #12:#35 // "<init>":(Ljava/lang/String;)V
#29 = Utf8 java/lang/StringBuilder
#30 = NameAndType #36:#37 // append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
#31 = Utf8 Tech
#32 = NameAndType #38:#39 // toString:()Ljava/lang/String;
#33 = Utf8 com/cpic/zuoqi/rpc/api/Test
#34 = Utf8 java/lang/Object
#35 = Utf8 (Ljava/lang/String;)V
#36 = Utf8 append
#37 = Utf8 (Ljava/lang/String;)Ljava/lang/StringBuilder;
#38 = Utf8 toString
#39 = Utf8 ()Ljava/lang/String;
{
public com.cpic.zuoqi.rpc.api.Test();
descriptor: ()V
flags: ACC_PUBLIC
Code:
stack=1, locals=1, args_size=1
0: aload_0
1: invokespecial #1 // Method java/lang/Object."<init>":()V
4: return
LineNumberTable:
line 3: 0
LocalVariableTable:
Start Length Slot Name Signature
0 5 0 this Lcom/cpic/zuoqi/rpc/api/Test;
void test();
descriptor: ()V
flags:
Code:
stack=3, locals=3, args_size=1
0: new #2 // class java/lang/String
3: dup
4: ldc #3 // String ABC
6: invokespecial #4 // Method java/lang/String."<init>":(Ljava/lang/String;)V
9: astore_1
10: new #5 // class java/lang/StringBuilder
13: dup
14: invokespecial #6 // Method java/lang/StringBuilder."<init>":()V
17: aload_1
18: invokevirtual #7 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
21: ldc #8 // String Tech
23: invokevirtual #7 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
26: invokevirtual #9 // Method java/lang/StringBuilder.toString:()Ljava/lang/String;
29: astore_2
30: return
LineNumberTable:
line 5: 0
line 6: 10
line 7: 30
LocalVariableTable:
Start Length Slot Name Signature
0 31 0 this Lcom/cpic/zuoqi/rpc/api/Test;
10 21 1 s1 Ljava/lang/String;
30 1 2 s2 Ljava/lang/String;
}
SourceFile: "Test.java"