英文:
String literals in .class file not found for concatenation operation
问题
在进行连接操作之前,是否会在常量池中为 "Tech" 创建一个对象?
我知道对于第一个字符串会创建两个对象。一个在常量池中,另一个在堆区,s1 将引用到堆区的对象。
对于第二个字符串对象,s2 将引用堆区中的对象(连接结果)。
但问题是,是否会在常量池中为字符串 "Tech" 创建一个对象。
请注意,我在某处读到过,在代码中的所有字符串字面量都会在常量池中分配内存,这在编译阶段就会决定。要验证这一点,可以在 .class 文件中找到字符串字面量。但是在编译了下面的代码后,在 .class 文件中并没有找到 "Tech"。
String s1 = new String("ABC");
String s2 = s1 + "Tech";
英文:
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";
答案1
得分: 1
我的jdk版本是1.8,"Tech"字符串(#31)存在于类文件的常量池
中。
Classfile /D:/work/sentinel-1.8.0/Sentinel-1.8.0/rpc/rpc-consumer/target/test-classes/com/cpic/zuoqi/rpc/api/Test.class
最后修改时间 2020-10-10;大小 656 字节
MD5 校验和 23cf1e4d4960807b50ebc6e180f895ab
编译自 "Test.java"
public class com.cpic.zuoqi.rpc.api.Test
次要版本号: 0
主要版本号: 52
标志: ACC_PUBLIC, ACC_SUPER
常量池:
#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();
描述符: ()V
标志: ACC_PUBLIC
Code:
栈=1, 局部变量=1, 参数大小=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();
描述符: ()V
标志:
Code:
栈=3, 局部变量=3, 参数大小=1
0: new #2 // 类 java/lang/String
3: dup
4: ldc #3 // 字符串 ABC
6: invokespecial #4 // Method java/lang/String."<init>":(Ljava/lang/String;)V
9: astore_1
10: new #5 // 类 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 // 字符串 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"
英文:
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"
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论