java中的字符串池

时间:2013-06-12 12:53:43

标签: java string

我在字符串池中创建了2个字符串,而没有使用新的关键字,如图所示 以下

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

我通过连接上面两个字符串来创建另一个字符串,如下所示

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

结果是假的。

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

5 个答案:

答案 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

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

答案 4 :(得分:0)

RULE:将字符串与.equals()进行比较

这可能过于笼统,但现在只要遵守该规则