比较Java中的字符串引用

时间:2013-10-25 14:16:31

标签: java string

以下代码段中的代码只是比较字符串引用。

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),但为什么前两个示例的返回输出与前面的示例不同?

6 个答案:

答案 0 :(得分:3)

Java编译器将预先评估所有仅限常量的操作。 (这称为constant folding

因此,"A" + "b" + 3会编译为"Ab3"

答案 1 :(得分:2)

因为编译器足够聪明,可以看到

String str2 = "mystring"+9;

是一个常量表达式,因此它在编译时对其进行求值,从而得到一个文字字符串"mystring9"

字符串文字存储在池中,以便可以重复使用,这就是为什么str1str2引用相同的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.1String Concatenation Operator +

  

如果只有一个操作数表达式是String类型,则为string   转换(第5.1.11节)在另一个操作数上执行以产生a   运行时的字符串。

因此String str2 = "myString"+9会产生“myString9”,因此str1str2对文字池保持相同的引用,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".

一样