我有一些奇怪的字符串池行为的问题。
我正在使用==比较相等的字符串,以查明它们是否在池中。

public class StringPoolTest {
  public static void main(String[] args) {
    new StringPoolTest().run();
  }

  String giveLiteralString() {
    return "555";
  }

  void run() {
    String s1 = giveLiteralString() + "";
    System.out.println("555" == "555" + "");
    System.out.println(giveLiteralString() == giveLiteralString() + "");
  }
}

输出为:
true
false

这对我来说是一个很大的惊喜。有人可以解释一下吗?
我认为这是在编译时发生的。但是,为什么在字符串中添加""根本没有任何区别呢?

最佳答案

"555" + ""

compile-time constant,而
giveLiteralString() + ""

不是。因此,前者仅编译为字符串常量“555”,而后者则编译为实际的方法调用和连接,从而生成一个新的String实例。

另请参阅JLS §3.10.5 (String Literals):

08-07 21:26