无法理解 Java 字符串文字是如何实现的
Can't understand how Java string literals are implemented
我正在学习 StringBuider class。我在这个网站和许多其他书籍中读到,当编译器遇到文字的“+”运算符时,它会自动使用 StringBuilder append 的方法来连接它们。
这似乎有点问题,因为 StringBuilder 对象将在 运行 时创建,但 String 引用应该在编译时就已获取连接 String 对象的地址。
String s1 = "hello";
String s2 ="bc";
int value = 22;
编译时"meets"这段代码:
String s = s1+s2+22;
它"changes"它到:
String s = new StringBuilder().append("hello").append("bc").append(22).toString();
可能是我误会了什么?
15.18.1. String Concatenation Operator +
An implementation may choose to perform conversion and concatenation in one step to avoid creating and then discarding an intermediate String object. To increase the performance of repeated string concatenation, a Java compiler may use the StringBuffer class or a similar technique to reduce the number of intermediate String objects that are created by evaluation of an expression.
在你的情况下,
String s1 = "hello";
String s2 ="bc";
int value = 22;
String r = s1 + s2 + value;
你会得到
INVOKESPECIAL java/lang/StringBuilder.<init> ()V
ALOAD 1
INVOKEVIRTUAL java/lang/StringBuilder.append (Ljava/lang/String;)Ljava/lang/StringBuilder;
ALOAD 2
INVOKEVIRTUAL java/lang/StringBuilder.append (Ljava/lang/String;)Ljava/lang/StringBuilder;
ILOAD 3
INVOKEVIRTUAL java/lang/StringBuilder.append (I)Ljava/lang/StringBuilder;
INVOKEVIRTUAL java/lang/StringBuilder.toString ()Ljava/lang/String;
连接常量对象时
String r = "hello" + "bc" + 22;
你会得到
LDC "hellobc22"
ASTORE 2
When the compiler "meets" this code:
String s = s1+s2+22;
it "changes" it to:
String s = new StringBuilder().append("hello").append("bc").append(22).toString();
没有。它可能会将其优化为
String s = new StringBuilder().append(s1).append(s2).append(value).toString();
但它不能用 "hello"
替换 s1
,因为不能保证变量会一直引用 "hello"
。该变量不是最终变量,因此可以重新分配。
我正在学习 StringBuider class。我在这个网站和许多其他书籍中读到,当编译器遇到文字的“+”运算符时,它会自动使用 StringBuilder append 的方法来连接它们。
这似乎有点问题,因为 StringBuilder 对象将在 运行 时创建,但 String 引用应该在编译时就已获取连接 String 对象的地址。
String s1 = "hello";
String s2 ="bc";
int value = 22;
编译时"meets"这段代码:
String s = s1+s2+22;
它"changes"它到:
String s = new StringBuilder().append("hello").append("bc").append(22).toString();
可能是我误会了什么?
15.18.1. String Concatenation Operator +
An implementation may choose to perform conversion and concatenation in one step to avoid creating and then discarding an intermediate String object. To increase the performance of repeated string concatenation, a Java compiler may use the StringBuffer class or a similar technique to reduce the number of intermediate String objects that are created by evaluation of an expression.
在你的情况下,
String s1 = "hello";
String s2 ="bc";
int value = 22;
String r = s1 + s2 + value;
你会得到
INVOKESPECIAL java/lang/StringBuilder.<init> ()V
ALOAD 1
INVOKEVIRTUAL java/lang/StringBuilder.append (Ljava/lang/String;)Ljava/lang/StringBuilder;
ALOAD 2
INVOKEVIRTUAL java/lang/StringBuilder.append (Ljava/lang/String;)Ljava/lang/StringBuilder;
ILOAD 3
INVOKEVIRTUAL java/lang/StringBuilder.append (I)Ljava/lang/StringBuilder;
INVOKEVIRTUAL java/lang/StringBuilder.toString ()Ljava/lang/String;
连接常量对象时
String r = "hello" + "bc" + 22;
你会得到
LDC "hellobc22"
ASTORE 2
When the compiler "meets" this code:
String s = s1+s2+22;
it "changes" it to:
String s = new StringBuilder().append("hello").append("bc").append(22).toString();
没有。它可能会将其优化为
String s = new StringBuilder().append(s1).append(s2).append(value).toString();
但它不能用 "hello"
替换 s1
,因为不能保证变量会一直引用 "hello"
。该变量不是最终变量,因此可以重新分配。