java中String字符串==的疑问?

java中String字符串==的疑问?谁能帮忙解释和理解一下!顺便说一下底层的原理和运行规则?
直接po代码和截图

public class TestString {

    /** 
    * 测试String
    */
    public static void main(String[] args) {
        String a = "hello2";
        final String b = getStr2();
        String c = b + 2;
        String d = "hello2";
        String e = new String("hello2");
        String f = new String("hello2");
        String h = "hello";
        String j = h + 2;
        StringBuffer sb = new StringBuffer("hello2");
        StringBuilder sb2 = new StringBuilder("hello2");
        String k = getStr2();
        String m = k + 2;
        System.out.println("c结果" + (a == c));
        System.out.println("d结果" + (a == d));
        System.out.println("e结果" + (a == e));
        System.out.println("f结果" + (a == f));
        System.out.println("f.toString()结果" + (a == f.toString()));
        System.out.println("j结果" + (a == j));
        System.out.println("sb.toString()结果" + (a == sb.toString()));
        System.out.println("sb2.toString()结果" + (a == sb2.toString()));
        System.out.println("m结果" + (a == m));
    }

    public static String getStr() {
        String text = "hello";
        return text;
    }

    public static String getStr2() {
        return "hello";
    }

}

图片说明
图片说明

String是引用类型,可以理解为c语言的指针,即其是指向某个地址的值,d结果为true是因为原来池里面已经有了估a和d指向的是同一个地址的值,如果是判断值是否相等可以用equals

可以用a.equal(b) 若两个String字符完全相同就会输出true
String+int 型虽然不会报错,但是出来的数据不是String型也不会是int型
==比较常用在两个int型数据中是等于的意思

简单来说,==比较的是引用,equals比较的是值
引用相同,字符串必然相同,引用不同,字符串可能相同,可能不同。

好比比较两张纸上的字,如果你比较的是同一张纸,那么肯定相同。比较两张不同的纸,上面的字可能相同,也可能不同。
d那个结果是true的原因是,编译器会将编译期间遇到的字符串常量先存在常量池里,并且所有相同的值,只存一个,所以两个引用指向同样的常量,==就是true了。

一句话,只要=右边是一个“”中的字符串,他就会保存在常量池中,被共享。
getStr和getStr2都返回的是 常量
其实,你的问题都可以在java的经典书籍中找到,比如:『java核心技术卷一』、『Java编程思想』...
上面会有很好的解释,并且有丰富的例子。