String的内存分析

【1】字符串拼接:

public class Test02 {
    //这是一个main方法:是程序的入口
    public static void main(String[] args) {
        String s1="a"+"b"+"c";
        String s2="a"+"bc";
        String s3="ab"+"c";
        String s4="abc";
        String s5="abc"+"";
    }

}

上面的字符串会进行编译器优化,直接合并成完整的字符串,我们可以反编译验证:

 

 然后再常量池中,常量池的特点是第一次如果没有这个字符串,就放进去,如果有这个字符串 就直接从常量池中取

 

 【2】new关键字创建对象

String S6=new String("abc");

内存:开辟两个空间(1.字符串常量池中的字符串2.堆中的开辟的空间)

 

 【3】有变量参与的字符串拼接:

public class Test03 {
    //这是一个main方法:是程序的入口
    public static void main(String[] args) {
        String a="abc";
        String b=a+"def";
        System.out.println(b);
    }

}

a变量在编译的时候不知道a是“abc”字符串,所以不会进行编译期优化,不会直接合并为“abcdef”

反汇编过程:为了更好的帮我分析字节码文件是如何解析的:

利用IDEA中控制台

 

posted @ 2022-10-18 20:29  爱的加勒比  阅读(63)  评论(0)    收藏  举报