String和.intern()

final 和 String

public static void main(String[] args) {
        String a1 = "a";
        String a2 = "b";
        // 非final串相加,指向堆中new的对象
        String a3 = a1+a2;
        String a4 = "ab";
        String a5 = new String("ab");
        System.out.println("a3==a4?"+(a3==a4));//false
        System.out.println("a3==a5?"+(a3==a5));//false
        System.out.println("a4==a5?"+(a4==a5));//false

        // final串相加,直接指向常量池中存在的
        final String a6 = "a";
        final String a7 = "b";
        String a8 = a6+a7;
        System.out.println("a3==a8?"+(a3==a8));//false
        System.out.println("a4==a8?"+(a4==a8));//true
        System.out.println("a5==a8?"+(a5==a8));//false

    }

intern方法

s3.intern()在 Stirng s4 = "11"之前

public static void main(String[] args) {
        String s3 = new String("1") + new String("1");
        s3.intern();
        String s4 = "11";

        System.out.println(s3 == s4);// s3.intern()在 s4创建之前 true
    }

s3.intern()在 Stirng s4 = "11"之后

public static void main(String[] args) {
        String s3 = new String("1") + new String("1");
        String s4 = "11";
        s3.intern();

        System.out.println(s3 == s4);// s3.intern()在 s4创建之后 false
    }

直接new String("11") 也返回false

public static void main(String[] args) {
        String s3 = new String("11");
        s3.intern();
        String s4 = "11";

        System.out.println(s3 == s4);// false
    }

猜想:s3 = new String("1")+ new String("1");时常量池中不存在"11"

所以调用s3.intern()使得,s3指向了常量池。

如果s3 = new String("11")那么常量池中会创建一个"11"则,调用s3.intern()不起作用s3还是指向new String("11")。

或者s3 = new String("1")+ new String("1");s4 = "11"则,常量池中还是有"11"所以数s3.intern()不起作用

原文地址:https://www.cnblogs.com/wsZzz1997/p/14692889.html