8

这是关于“+”运算符返回的结果的差异。结果因字符串文字和字符串对象而异。

String str="ab";
String str1="c";
String str2 = "ab"+"c"; // Line 3
String str3 = "abc";
String str4 = str+str1;  // Line 5

System.out.println(str2==str3);  // True
System.out.println(str2==str4);  // False

根据结果​​,我们可以推断,使用字面量,从字符串池中返回已经可用的对象,就像第 3 行的情况一样,使用字符串对象返回新的对象,就像第 5 行一样。为什么会这样?

4

4 回答 4

9

根据可以计算表达式的时间,+对 s 的运算符的处理方式有所不同。String

当表达式可以在编译时进行评估时(如第 3 行),编译器将创建String仅包含串联的 a。因此,在第 3 行中,只会String创建“abc”,String并将其放入 .class 文件中。因此str3,andstr4将完全相同,并将被拘留。

当使用只能在运行时评估的连接时(如第 5 行),结果String是一个新对象String,必须与它进行比较,equals()因为它是一个新对象。

于 2013-06-25T06:19:46.970 回答
3

String str2 = "ab"+"c";这是在编译时评估的。它进入常量池,因为编译器已经知道它。

另一个可以在运行时评估,它不会是常量池的一部分。

这是一个很好的机会来注意与使用String#concat的情况的区别,如果你这样做的话

String str2 = "ab".concat("c");

由于 String 是不可变的,因此会返回一个新的 String,concat从而导致str不被实习。所以在这种情况下,str2 == str3将是false

于 2013-06-25T06:20:09.550 回答
0

我已将问题标记为重复,但发现没有发布类似的答案,所以想试一试。其他答案已经指出了为什么答案是错误的。但这里有一些东西可以告诉你什么时候它会是真的。

如果您调用intern()第二个字符串,则结果将是true.

为什么这行得通?

为了节省内存(并加快相等性测试),Java 支持字符串的“实习”。当在intern()字符串上调用该方法时,会在一个内部字符串表上执行查找。如果表中已存在具有相同内容的 String 对象,则返回对表中 String 的引用。否则,将字符串添加到表中并返回对它的引用。

String str4 = (str+str1).intern();

显式调用intern()返回对实习字符串的引用。

于 2013-06-25T06:33:53.747 回答
0

当您创建 str、str1、str2 和 str3 时,它将指向同一个字符串池。这里它不会创建字符串对象。但是当你创建 String str4 = str+str1.So str4 是在运行时评估的。所以它不会是指向所有其他字符串的同一个字符串池的一部分。所以 str4 返回 false ..

于 2013-06-25T06:45:17.650 回答