Java 字符串常量池相关

代码如下,请问为啥会是这种情况?

public class Main {
    public static void main(String[] args) {
        test1();
        test2();
    }

    public static void test1() {
        String x = "x";
        String y = "y";
        String a = x + y;

        String c = a.intern();
        String b = "xy";

        System.out.println(a == c); //输出true
    }

    public static void test2() {
        String x = "x";
        String y = "y";
        String a = x + y;

        String b = "xy";
        String c = a.intern();

        System.out.println(a == c); //输出false
    }
}

输出如下:

true
false

简单说下吧
String.intern() 就是手动把对象放进常量池中
说明下这个解释是针对于JDK8,7和8还是有区别的

方法一

  String a = x + y //字符串拼接 在堆中
  String c = a.intern(); //c是 "xy"放进常量池中,应用堆中对象地址
  String b = "xy"; //拿常量池中和c一样 指向堆中xy对象地址。
 
  System.out.println(a == c); //true,c虽然是来自常量池引用还是堆中xy对象地址。

方法二

public static void test2() {
        String x = "x";
        String y = "y";
        String a = x + y;//a是堆中xy地址
 
        String b = "xy"; //常量池中xy
        String c = a.intern();//"xy"是否已经在常量池中存在,存在,拿常量池xy地址 c是常量池xy地址
 
        System.out.println(a == c); //输出false a是堆中 c是常量池 false
    }