我在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
。
为什么两种情况下的输出都不相同?
答案 0 :(得分:7)
字符串s3
正在分配给compile-time constant,这与"abbc"
完全相同。因此,s2==s3
比较两个相同的字符串文字,这导致true
,因为这些文字被实习。
s0+s1
不是编译时常量,因此会生成一个新的字符串对象。因此,s==s2
会返回false
。
就字节代码而言,
String s3="ab"+"bc";
变为
LDC "abbc"
ASTORE 1
请注意,"abbc"
是直接使用的。
最后,如果您将s0
和s1
声明为final
,那么s0+s1
将成为常量表达式{{1}将是真的。
答案 1 :(得分:1)
==
运算符比较对象的指针,而不是对象本身。要比较字符串值,您应使用equals(..)
或equalsIgnoreCase(..)
,以适当的为准。
字符串s2
和s3
可能比较相同,因为它们是在幕后实现的。 Interning正在使用常用的字符串,将它们保存在(我认为)PermGen中,并且只使用该字符串的单个引用。当你有很多具有相同值的字符串并且因为字符串是不可变的时,这很有用。每当您向字符串添加内容时,都会创建一个新字符串。