https://juejin.cn/post/6930983856128557064

在 JDK1.6 中,常量池和堆是明显分隔的,JDK 1.7 之后,常量池放在堆上

intern() 找常量替代,修改成放在堆上的时候,省去了重新在常量池中建立一个新的常量的过程

但是在 22 版本中我没有看到这个的有力证据(可能又把这个 feature 去掉了罢

/// java 22.0.2
public static void main(String[] args) {
    String s = new String("s");
    String s1 = s.intern();
    String s2 = "s";
    System.out.println(s2 == s); // false
    System.out.println(s2 == s1); // true
 
}

然后事实证明,如果


用 + 的时候实际上调用的是 StringBuilder 类来生成新的字符串,这个类的构造方法中使用的是 new 来构造,所以用 + 字符串拼接的时候实际上是在 new