以下代码段中的代码只是比较字符串引用。
String str1 = "mystring9";
String str2 = "mystring"+String.valueOf(9);
System.out.println(str1==str2);
在这种情况下,str1==str2
会返回false
。
以下代码段也会返回false
。
String str1 = "mystring9";
String str2="mystring"+str1.length();
System.out.println(str1==str2);
以下代码返回true
。
String str1 = "mystring9";
String str2 = "mystring"+9;
System.out.println(str1==str2);
我认为,此代码中的表达式"mystring"+9
应在内部评估为String.valueOf(9)
,但为什么前两个示例的返回输出与前面的示例不同?
答案 0 :(得分:3)
Java编译器将预先评估所有仅限常量的操作。 (这称为constant folding)
因此,"A" + "b" + 3
会编译为"Ab3"
。
答案 1 :(得分:2)
因为编译器足够聪明,可以看到
String str2 = "mystring"+9;
是一个常量表达式,因此它在编译时对其进行求值,从而得到一个文字字符串"mystring9"
。
字符串文字存储在池中,以便可以重复使用,这就是为什么str1
和str2
引用相同的String
对象(可以通过比较它们来检查) ==
)。
答案 2 :(得分:2)
这是因为编译器可以在编译期间创建String - 即:
"mystring"+9
变为"mystring9"
答案 3 :(得分:2)
取决于编译代码的时间。
最后一个在编译时重新编号。您还可以使用
添加一个示例String str1 = "mystring9";
String str2 = "mystring"+"9";
System.out.println(str1==str2);
你会看到返回true
答案 4 :(得分:2)
String str1 = "mystring9";
执行此行会在字符串文字池中创建一个字符串“myString9”以供重用。
根据JLS section 15.18.1:String Concatenation Operator +
如果只有一个操作数表达式是String类型,则为string 转换(第5.1.11节)在另一个操作数上执行以产生a 运行时的字符串。
因此String str2 = "myString"+9
会产生“myString9”,因此str1
和str2
对文字池保持相同的引用,str1==str2
给出true
。
答案 5 :(得分:1)
String str1 = "mystring9";
String str2 = "mystring"+9;
System.out.println(str1==str2);
那是true
,因为它们都在编译时解决了。
顶部的其他两个案例在runtime
处解决。
当我们用(+)运算符连接字符串时,JVM返回新的StringBuilder(string...).toString()
当你在源代码中连接字符串文字时,在堆内存中创建一个新的String实例“是不正确的,
例如,"test" + "test".
这种连接是在编译时完成的,就像你编写"testtest".
一样