Java字符串折腾

  • JDK 17

字符串常量池String Pool

  • 存放位置:堆内

D8D19E25-4AF0-4E90-ADDF-DFC5820091C8.png

运行代码

    public static void main(String[] args) {
        String s1 = new String("1");
        String s2 = "1";
        System.out.println(s1 == s2);//
        System.out.println("----S2-----");
        String s3 = s1 + "1";//在堆中创建了一个新的对象,内存地址不同于String Pool中
        String s4 = "1" + "1";
        System.out.println(s3 == s4);
        System.out.println("-----S4----");
        String s5 = s3.intern();//这里取出的是String Pool中的内存地址
        System.out.println(s5 == s3);
        System.out.println(s5 == s4);
        System.out.println("-----S5----");
        String s6 = "1" + "1";
        System.out.println(s3 == s6);
        System.out.println(s4 == s6);
        System.out.println(s5 == s6);
        System.out.println("-----S6----");
        String s7 = "11";
        System.out.println(s3 == s7);
        System.out.println(s4 == s7);
        System.out.println(s5 == s7);
        System.out.println(s6 == s7);
        System.out.println("-----S7----");
        String s8 = s7;
        System.out.println(s3 == s8);
        System.out.println(s4 == s8);
        System.out.println(s5 == s8);
        System.out.println(s6 == s8);
        System.out.println(s7 == s8);
        System.out.println("----S8-----");
        String s9 = "1" + "1";
        System.out.println(s3 == s9);
        System.out.println(s4 == s9);
        System.out.println(s5 == s9);
        System.out.println("----S9-----");
        String ss1 = new String("1") + new String("1");//在堆中创建了一个新的对象,内存地址不同于String Pool中
        String ss2 = ss1.intern();
        System.out.println(ss1 == ss2);// false
    }

控制台输出

false
----S2-----
false
-----S4----
false
true
-----S5----
false
true
true
-----S6----
false
true
true
true
-----S7----
false
true
true
true
true
----S8-----
false
true
true
----S9-----
false