public class hello{
public static void main(String args[]){
String a = "A";
String b = "B";
String c = a+b;
System.out.println(c);
}
}
这一块代码到底发生了什么呢,今天看了下字节码理解了这一过程的原理,
先上图吧~
使用javap功能可以查看编译后的class文件的一些信息,具体的其他功能可以从命令javap -help 中了解.
这里用上了-c选项 对class文件进行反汇编成字节码
从字节码中可以看出,先是实例化了一个字符串A和一个字符串B,当程序执行到
String c = a+b;
这一行的时候,可以看到这时候实例化了一个StringBuilder对象,然后执行了两次append方法,将变量a和变量b添加到对象中后执行了toString赋值给变量c
最后就是输出了变量c的内容
可以发现字符串"A"+字符串"B"背后的原理其实就是new StringBuilder().append("A").append("B").toString();
今天发现直接拼接字符串和两个String变量拼接是不一样的
看下面的代码生成了几个对象
public class StringTest{
public static void main(String args[]){
String C = "A"+"B";
String D = new String(C);
}
}
思考过后来从字节码中看看到底发生了什么
如图,答案是生成了两个对象,生命变量C的时候直接得到一个"AB"对象,而不是“A”对象、"B"对象以及"AB"对象