可能重复:
Difference Between Equals and ==
In JDK 1.6, can String equals operation can be replaced with ==?
How do I compare strings in Java?
在玩Java-Strings时,我没想到会有以下结果:
public class Sandbox {
public static void main(String[] args) {
String a = "hello";
String b = "hello";
System.out.println(a == b); //true Why?, a and b both are seperate Objects
System.out.println(a == "hello"); //true Why?
System.out.println(a == new String(b)); //false As expected
}
}
我预计一切都是假的,因为“==”比较了引用。为什么会这样?
当我更改String b = "world"
时,System.out.println(a == b);
会返回false
。看起来好像String-Object的内容正在进行比较。
由于Java 7可以在switch-case-Statements中比较Strings,我认为它可能与Java-Version有关。但正如here所述,在比较Switch-Case中的字符串时会调用equals-Methode。
答案 0 :(得分:3)
Java始终(从1.0版开始)实现了字符串文字。这意味着将常量字符串添加到池中,并且重复项引用同一对象。
final String a = "hello";
final String b = "hell";
System.out.println(a == b + 'o');
这会打印true
,因为编译器可以内联并简化表达式b + 'o'
,使其与“hello”相同。
答案 1 :(得分:2)
JVM在实例化字符串文字时执行some trickery以提高性能并减少内存开销。为了减少在JVM中创建的String对象的数量,String类保留了一个字符串池。每次代码创建字符串文字时,JVM首先检查字符串文字池。如果池中已存在该字符串,则返回对池化实例的引用。如果池中不存在该字符串,则新的String对象将实例化,然后放入池中。 Java可以进行优化,因为字符串是不可变的,可以共享而不用担心数据损坏。