public class Strings
{
public static void main(String ads[])
{
String a = "meow";
String ab = a + "deal";
String abc= "meowdeal";
System.out.println (ab==abc);
}
}
为什么输出为false
?
在此计划中ab
在string
字面值中创建,然后abc
创建,但为什么ab
和abc
不引用字符串常量池中的相同内存,因为在创建abc
之前,它在字符串常量池中搜索String meowdeal 。
答案 0 :(得分:5)
Java只汇集它在编译时知道的字符串;字符串常量和常量字符串表达式。 a是一个局部变量,所以+"交易"是一个字符串表达式,直到运行时才被评估(即使你看它它可以看到它应该是常量)。 Java编译器并不知道它是一个常量表达式,并且不会将它放在池中。它在运行时执行字符串连接,从而产生与池中任何对象不同的对象。
答案 1 :(得分:1)
我将解释发生了什么:
public class Strings {
public static void main(String ads[]) {
String a = "meow"; // new string created
String ab = a + "deal"; // again a new string created. Reference different.
String abc = "meowdeal"; // a whole new string.
System.out.println(ab == abc);// even though the values are same, reference is different. For value equality, use .equals()
}
}
答案 2 :(得分:1)
您的问题暗示您希望Java检查每个字符串连接的结果,以查看字符串常量池中是否存在匹配的字符串 - 但这将非常低效。除非所有字符串都是编译时常量,否则字符串连接始终是新对象。
如果你真的想用==
来比较字符串,你需要实现构造的字符串,如下所示:
ab=(a+"deal").intern();
然而,这将是一个非常具体的用例,并且非常罕见。
请注意,这与两个常量连接时的情况不同;给定"ab"+"cd"
编译器 required 将表达式解析为"abcd"
并汇总结果。如果其中一个或两个值是编译时常量static final ...
,情况也是如此。