class X
{
public static void main(String...a)
{
String a = "meow";
String ab = a + "deal";
String abc = "meowdeal";
System.out.println(ab == abc);
}
}
我的输出是假的......为什么。 我准备ocjp。我瘦,我们必须成真。 Beacuse ab包含“meowdeal”。当我试图将“meowdeal”分配给abc时,这个文字已经在字符串池中了。所以ab和abc都指向同一个对象。然后我们必须成真。
答案 0 :(得分:2)
问题是a
不是final
会导致编译器优化失效。
如果a
不是最终版,则需要进行数据流分析,以确定ab
的初始化是特殊的。
final String a = "meow";
String ab = a + "deal";
String abc = "meowdeal";
System.out.println(ab == abc);
System.out.println("meow" + "deal" == "meowdeal");
将产生真实+真实。
我可以想象其他 java编译器处理不同的内容。
答案 1 :(得分:1)
请尝试equals()
:
class X
{
public static void main(String...a)
{
String a = "meow";
String ab = a + "deal";
String abc = "meowdeal";
System.out.println(ab.equals(abc));
}
}
答案 2 :(得分:0)
==
运算符检查两个变量是否引用同一对象。您有两个不同的字符串对象,包含相同的文本。 equals
方法将返回true,但==
返回false,因为它们是不同的对象(无论其内容如何)。
答案 3 :(得分:0)
==检查引用,而不是对象本身。如果你写
String a = "meow";
String ab = a;
然后
System.out.println(a == ab);
会给你真实的。
如果你想比较字符串,你应该使用equals()。它将是:
String a = "meow";
String ab = a + "deal";
System.out.println(ab.equals(abc));