MTK——String

注意:

  • 需要注意的是"na" + "me" != s1 + s2//其中s1="na", s2="me",由于s1是一个变量,javac编译器启动优化,自动生成StringBuilder,进行字符串连接操作,因此生成的新字符串会出现在java堆中,下面是截取的一部分反编译程序:

    image.png

  • 注意string.intern():将string对象拉入常量池,并返回一个指向常量池的引用。

public class Intern {
    public static void main(String[] args) {
        String s1 = "name";
        String s2 = new String("name");
        String s3 = "na";
        String s4 = "me";
        String s5 = "na" + "me";
        String s6 = s3 + s4;

        System.out.println(s1 == s2);//常量池 != 堆,false
        System.out.println(s1 == s5);//均在常量池,true
        System.out.println(s1 == s6);//由于StringBuilder在堆中生成了新对象,特别注意和上一个区别,false
        System.out.println(s1 == s6.intern());//s6.intern(),拉回了常量池,如果常量池存在,直接返回,true
        System.out.println(s2 == s2.intern());//false,s2.intern()返回一个新引用,指向常量池。
    }
}

你可能感兴趣的:(MTK——String)