字符串"+"操作的原理
在阿里手册上意外的看到了一段关于java中对字符串的“+”运算的处理 突然间想到要详细了解下这个知识点,于是从网上找资料学习了一下。代码测试地址
一、"+"操作内部原理到底是如何实?
我们知道这里我们是无法像其他方法一样看到实现的逻辑的,原因很简单“+”拼接的字符串其实是Java提供的一个语法糖,其目的更方便程序员使用,让程序更加简洁,有更高的可读性。
要想看到内部原理就需要我们把他生成的字节码进行反编译
1、如下图代码:我们反编译一下,看看结果。
反编译后的内容如下:(反编译命令 :javap -c classpath 或者 idea配置字节码工具)
过查看反编译以后的代码,我们可以发现,原来字符串常量在拼接过程中,是将String转成了StringBuilder后,使用其append方法进行处理的。
通过上面的代码说明,Java中的+对字符串的拼接,其实现原理是使用StringBuilder.append。
Java中的+对字符串的拼接都是StringBuilder吗?我个人理解其实不然
2、为什么呢?如下图:
反编译后的内容如下:
我们可以发现它并没有使用StringBuilder,这是为什么呢?
总结:原来当+两边连接的是字符串常量时,虚拟机会直接进行优化,看成一个字符串,当+的一边是引用的时候,虚拟机就会创建StringBuilder,利用append方法进行连接操作。
二、null + 字符串是如何处理的
如下图:
也许你会认为它只会输出“string”,其实不然 ,它的输出结果如下图:
有上面的结论我们知道它是使用StringBuilder.append方法进行处理的,那么我们只需查询append的源码,便可得到结果,如下图
原来这是Java String对 null 对象的容错处理,它会把null拼接成了一个字符串,
三、循环体内为什么不建议字符串"+"
反编译后的内容如下:(字节码学习)
这就是为什么每次循环都会 new 出一个 StringBuilder 对象的原因,也是导致“+”操作效率低的主要原因
四、总结
1、+两边连接的是字符串常量时,虚拟机会直接进行优化,看成一个字符串,当+的一边是引用的时候,虚拟机就会创建StringBuilder,利用append方法进行连接操作
2、+左右可以为null,并不会包空指针
3、从字节码来看“+”操作使用StringBuiler来拼接时,一行+ + +的语句只会创建一个StringBuilder
4、循环体内,有字符串的“+”操作时,推荐使用 StringBuilder