使用字符串运算符构建字符串

时间:2015-11-09 14:33:10

标签: java

在这个例子中,我认为结果是真的。我以为变量存储在字符串池中。 答案是:返回false,因为两个String对象在内存中不一样。一个直接来自字符串池,另一个来自使用String操作构建。

String a = "";
 a += 2;
 a += 'c';
 a += false;
 if ( a == "2cfalse") System.out.println("==");

我不明白存储变量a的位置

1 个答案:

答案 0 :(得分:3)

好的,所以有两个回应。首先,道德上正确的,不要使用==测试字符串,始终使用.equals().equalsIgnoreCase()

其次,确实是"a" == "a",因为字符串存储在同一个池中,就像你所说的那样。这里的问题是你追加它。附加到字符串会导致它变为不同的字符串,该字符串不存储在字符串池中。字符串池仅在编译时生成,并且第二个字符串是在运行时计算的,它与在编译时生成的字符串不匹配。

想象一个字符串池就像这样工作:

a = "test";
b = "te";
c = "st";
d = "test";

编译器将其转换为

sp1 = "test";
sp2 = "te";
sp3 = "st";
a = sp1;
b = sp2;
c = sp3;
d = sp1;

现在==将检查两个变量是否引用相同的sp。如果你运行b + c java将不会返回并检查是否有任何sp与此相同。它只在编译时才这样做。