-1

我在字符串池中创建 2 个字符串而不使用 new 关键字,如下所示

String s="abc";
String s1="def";

我通过连接上述两个字符串再创建一个,如下所示

String s3=s+s1;
System.out.println(s3==s+s1);

结果是假的。

我想知道结果背后的原因,是因为不可变性,即字符串的状态不能改变。

4

5 回答 5

3

我想您知道,==运算符比较对象引用,而不是对象内容。true仅当操作数是相同的物理对象时才返回。

它在这里返回的原因false仅仅是因为连接进行了两次,所以你最终得到了两个不同的计算String对象。Java 编译器不够积极,无法在编译时评估这两个表达式,并且在运行时,String连接的结果不会添加到实习池中。

于 2013-06-12T12:56:48.123 回答
2

==供参考比较。如果您需要对象比较,您应该使用.equals

关于字符串连接。

来自http://docs.oracle.com/javase/specs/jls/se7/html/jls-3.html#jls-3.10.5

在运行时通过连接计算的字符串是新创建的,因此是不同的。

于 2013-06-12T12:56:52.707 回答
0

是的,字符串是不可变的,但在运行时创建的字符串不是单例。因此,可以存在两个包含相同字符序列的 String 实例。

两个字符串相等,但不相同(这是您使用 == 运算符测试的内容)。

于 2013-06-12T12:56:53.673 回答
0

“==”运算符比较对象在内存中的位置或比较引用

Java String 类实际上覆盖了 Object 类中的默认 equals() 实现——它覆盖了该方法,因此它只检查字符串的值,而不是它们在内存中的位置。

所以如果你比较 s3.equals(s+s1) 那么它将返回 true

参考: http: //www.programmerinterview.com/index.php/java-questions/java-whats-the-difference-between-equals-and/

于 2013-06-12T13:03:11.270 回答
0

规则:用 .equals() 比较字符串

这可能太笼统了,但现在只需遵守该规则

于 2013-06-12T13:31:26.700 回答