最近在突然想到了String字符串拼接问题,于是做了一个demo测试了一下,到底String类型的字符串在拼接的时候,哪种情况下会走会走StringBulider进行字符串拼接,而哪种情况编译器会对代码进行优化?话不多说,先看demo
测试代码1.png
可以发现,str == str2的结果为false,那么我们在看看下一个例子。
测试代码2.png
这时候,两个字符串对比的结果为true。
这时候,疑问就来了,为什么结果会不一致呢?利用在cmd窗口输入javap -c TestDemo.class
命令,对字节码文件进行反编译,发现了问题所在?
测试代码1cmd.png
可以看到在案例1中,java代码底层走了StringBuilder,进行字符串拼接,然后调用了StringBuilder的toString方法。
测试代码2cmd.png
而案例2中,对class文件进行反编译,发现代码出现了一点变化,并没有走StringBuilder进行字符串拼接。
StringBuilder
进行拼接字符串,然后调用toString方法,当然返回的结果和常量池中的111
这个字符串的内存地址是不一样的,因此结果为false。"111" + ""
直接变成了 "111"
,两个String类型的变量都指向了常量池的111字符串,因此结果为true;