一尘不染

奇怪的字符串池行为

java

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

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

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


阅读 204

收藏
2020-12-03

共1个答案

一尘不染

"555" + ""

是一个编译时常量,而

giveLiteralString() + ""

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


另请参见JLS§3.10.5(字符串文字)

在运行时通过串联计算的字符串是新创建的,因此是不同的。

2020-12-03