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