之前一直在探讨利用new关键字创建String对象的个数,没有想过利用+连接字符串虚拟机是怎么实现的,下面利用jdk自带的反编译命令javap看一下String的执行过程
例1:
String s1 = "a";
String s2 = "b";
String s3 = "a" + "b";
先看直接用+连接两个字符串虚拟机是怎么执行的,在命令提示符下进入到class所在的文件夹下输入javap -v Test.class(程序所在的class文件)
经过查看发现利用+直接连接两个字符串常量,虚拟机会直接把这两个字符串连接起来看成一个字符串
例2:
String s1 = "a";
String s2 = "b";
String s3 = s1 + s2;
利用+连接两个引用,虚拟机看成StringBuilder,会创建一个StringBuilder对象,然后调用append方法进行追加操作,最后调用toString方法转换成String
例3:
String s4 = new String("s");
String s5 = new String("v");
String s6 = s4 + s5;
用+连接两个new创建的String对象,虚拟机也是会看成一个StringBuider进行append操作,最后执行toString
例4:
String s7 = "a";
String s8 = new String("h");
String s9 = s7 + s8;
当连接一个字符串常量和一个引用也是会看成StringBuilder进行操作
总结:当+两边连接的是字符串常量时,虚拟机会直接进行优化,看成一个字符串,当+的一边是引用的时候,虚拟机就会创建StringBuilder,利用append方法进行连接操作。