String的两个变量相加,用==比较同一个地址为什么为false?

问题遇到的现象和发生背景

初学java的在校生,今天在复习String内容的时候看笔记照着敲的,果然温故而知新。发现了新大陆但我百思不得其解,请cnds的友友们解答

问题相关代码,请勿粘贴截图
    String a="a";
    String b="b";
    String c=a+b;
    String d=a+b;
    System.out.println(d.hashCode());
    System.out.println(c.hashCode());
    System.out.println(c==d);
运行结果及报错内容

3105
3105
false

我的解答思路和尝试过的方法

常量相加是在池中,变量相加是在堆中,c和d都是由变量a+b得到的,所以是在堆,==比较的是地址值,我没有new的情况下,c和d不是指向同一个堆地址吗?用==比较同一个地址为什么还会是false呢?欢迎各位人生导师斧正。

我想要达到的结果

1.字符串拼接底层实际上是StringBuilder做的append,两个拼接都创建了新的对象,所以 == 是false
2.之所以hashcode是一样的,String重写了hashcode方法,实际上是 根据字符串算的,字符串内容不变 hashcode也不变

a+b 给你优化成 new String( a + b) 了