java中String字符串的==双等号比较?

java中String字符串的==双等号比较?谁能帮忙解释和理解一下!顺便说一下底层的原理和运行规则?不吝赐教,谢谢!

public class Test {
    public static void main(String[] args) {
        String a = "hello2";
        final String b = "hello";
        String d = "hello";
        String c = b + 2;
        String e = d + 2;
        System.out.println((a == c));
        System.out.println((a == e));

    }

}

图片说明

string 是对象,所以==对于string来说,是对比的内存地址,这个应该知道吧;
解释第一个:a==c//为true。 因为b被final修饰,那么它本身是一个常量,如果你原意的话,你可去看看编译后的class文件。里面变量c = "hello2",底层原理是java进行了优化。会查找内存中是否存在"hello2",如果存在,那么就将地址赋予c,很明显把a的内存地址赋予了c。所以才会a==c得到结果true
解释第二个:a==e//为false。因为string的+2,底层原理是,StringBuffer.append("2").toString(); 很明显,地址发生了改变,所以a==e得到结果会为false

字符串==比较的是引用的地址,equal比较的内容 a和c是相同的引用 a和e不是相同的引用

字符串b用final修饰且声明时就初始化了值,所以程序中任何用到变量b的地方就相当于直接使用"hello",所以c指向常量池中的hello2,
而字符串d不一样

img


这是你代码的反编译,一看就懂了