我在字符串池中创建 2 个字符串而不使用 new 关键字,如下所示
String s="abc";
String s1="def";
我通过连接上述两个字符串再创建一个,如下所示
String s3=s+s1;
System.out.println(s3==s+s1);
结果是假的。
我想知道结果背后的原因,是因为不可变性,即字符串的状态不能改变。
我想您知道,==
运算符比较对象引用,而不是对象内容。true
仅当操作数是相同的物理对象时才返回。
它在这里返回的原因false
仅仅是因为连接进行了两次,所以你最终得到了两个不同的计算String
对象。Java 编译器不够积极,无法在编译时评估这两个表达式,并且在运行时,String
连接的结果不会添加到实习池中。
==
供参考比较。如果您需要对象比较,您应该使用.equals
关于字符串连接。
来自http://docs.oracle.com/javase/specs/jls/se7/html/jls-3.html#jls-3.10.5
在运行时通过连接计算的字符串是新创建的,因此是不同的。
是的,字符串是不可变的,但在运行时创建的字符串不是单例。因此,可以存在两个包含相同字符序列的 String 实例。
两个字符串相等,但不相同(这是您使用 == 运算符测试的内容)。
“==”运算符比较对象在内存中的位置或比较引用
Java String 类实际上覆盖了 Object 类中的默认 equals() 实现——它覆盖了该方法,因此它只检查字符串的值,而不是它们在内存中的位置。
所以如果你比较 s3.equals(s+s1) 那么它将返回 true
参考: http: //www.programmerinterview.com/index.php/java-questions/java-whats-the-difference-between-equals-and/
规则:用 .equals() 比较字符串
这可能太笼统了,但现在只需遵守该规则