将两个Java字符串与“==”进行比较时出现意外结果

时间:2012-04-12 11:40:54

标签: java string compare

  

可能重复:
  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。

2 个答案:

答案 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可以进行优化,因为字符串是不可变的,可以共享而不用担心数据损坏。