我有一个简单的应用程序,它有一个比较两个文字字符串的 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 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 类的同一个实例。这是因为字符串文字——或者更一般地说,作为常量表达式值的字符串(第15.28 节)——是“ interned ”,以便使用 方法共享唯一实例。
String.intern