Java中的字符串添加显示意外行为

时间:2013-12-05 16:34:52

标签: java string

我在Java中有这个代码:

    String s0="ab";
    String s1="bc";
    String s2="abbc";
    String s3="ab"+"bc";
    String s=s0+s1;

当我尝试比较s& s2使用if(s==s2),返回false
但是在比较s2& s3使用,if (s2==s3)返回true

为什么两种情况下的输出都不相同?

2 个答案:

答案 0 :(得分:7)

字符串s3正在分配给compile-time constant,这与"abbc"完全相同。因此,s2==s3比较两个相同的字符串文字,这导致true,因为这些文字被实习。

s0+s1 不是编译时常量,因此会生成一个新的字符串对象。因此,s==s2会返回false


就字节代码而言,

String s3="ab"+"bc";

变为

LDC "abbc"
ASTORE 1

请注意,"abbc"是直接使用的。


最后,如果您将s0s1声明为final,那么s0+s1 成为常量表达式{{1}将是真的。

答案 1 :(得分:1)

==运算符比较对象的指针,而不是对象本身。要比较字符串值,您应使用equals(..)equalsIgnoreCase(..),以适当的为准。

字符串s2s3可能比较相同,因为它们是在幕后实现的。 Interning正在使用常用的字符串,将它们保存在(我认为)PermGen中,并且只使用该字符串的单个引用。当你有很多具有相同值的字符串并且因为字符串是不可变的时,这很有用。每当您向字符串添加内容时,都会创建一个新字符串。