2

可能重复:
Equals 和 == 的区别
在 JDK 1.6 中,String equals 操作可以用 == 代替吗?
如何比较 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 中的字符串,我认为它可能与 Java 版本有关。但正如这里所描述的,当比较 Switch-Case 中的字符串时会调用 equals-Methode。

4

2 回答 2

3

Java 总是(从 1.0 版开始)内嵌字符串文字。这意味着常量字符串被添加到池中并且重复引用相同的对象。

final String a = "hello";
final String b = "hell";
System.out.println(a == b + 'o');

这会打印出来true,因为编译器可以内联并将表达式简化为b + 'o'与“hello”相同。

于 2012-04-12T11:45:00.657 回答
2

JVM在实例化字符串文字时会执行一些技巧以提高性能并减少内存开销。为了减少在 JVM 中创建的 String 对象的数量,String 类保留了一个字符串池。每次您的代码创建字符串文字时,JVM 首先检查字符串文字池。如果该字符串已存在于池中,则返回对池实例的引用。如果池中不存在字符串,则实例化一个新的 String 对象,然后将其放入池中。Java 可以进行这种优化,因为字符串是不可变的,并且可以共享而不必担心数据损坏。

于 2012-04-12T11:44:22.283 回答