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中控制台

浙公网安备 33010602011771号