我有一个具有main方法的简单应用程序,该方法比较两个文字字符串:
public class App {
public static void main (String[] args) {
String first = "a";
String second = "a";
System.out.println(first == second);
}
}
当我在 Eclipse 中运行该程序时,得到false
的结果。但是,当我通过命令行编译并运行该程序时,我得到了true
。
两者的结果应为true
。 Eclipse为什么返回false
?
我已经使用JDK 7和8对其进行了测试。
请注意,我知道与==
进行比较会比较身份。
对于两个变量,JLS都要求"a"
从内部String缓存中出来。
String first = "a"; // Creates instance, stores in cache and returns
String second = "a"; // Should return instance from cache
但是,如果我从Eclipse运行此程序,则会得到false
进行比较,因此尽管JLS要求它们相同,但这两个实例似乎是不同的。
因此,请参见JLS§3.10.5 String Literals:
此外,字符串文字总是指的是String类的相同实例。这是因为字符串文字-或更广泛地说,是常量表达式(§15.28的值的字符串)被“ interned ”以使用方法{{ 1}}。