字符串"+"操作的原理

字符串"+"操作的原理

在阿里手册上意外的看到了一段关于java中对字符串的“+”运算的处理 突然间想到要详细了解下这个知识点,于是从网上找资料学习了一下。代码测试地址
阿里手册

一、"+"操作内部原理到底是如何实?

我们知道这里我们是无法像其他方法一样看到实现的逻辑的,原因很简单“+”拼接的字符串其实是Java提供的一个语法糖,其目的更方便程序员使用,让程序更加简洁,有更高的可读性。
要想看到内部原理就需要我们把他生成的字节码进行反编译

1、如下图代码:我们反编译一下,看看结果。

在这里插入图片描述
反编译后的内容如下:(反编译命令 :javap -c classpath 或者 idea配置字节码工具)
在这里插入图片描述过查看反编译以后的代码,我们可以发现,原来字符串常量在拼接过程中,是将String转成了StringBuilder后,使用其append方法进行处理的。
通过上面的代码说明,Java中的+对字符串的拼接,其实现原理是使用StringBuilder.append。

Java中的+对字符串的拼接都是StringBuilder吗?我个人理解其实不然

2、为什么呢?如下图:

在这里插入图片描述
反编译后的内容如下:
在这里插入图片描述
我们可以发现它并没有使用StringBuilder,这是为什么呢?
总结:原来当+两边连接的是字符串常量时,虚拟机会直接进行优化,看成一个字符串,当+的一边是引用的时候,虚拟机就会创建StringBuilder,利用append方法进行连接操作。

二、null + 字符串是如何处理的

如下图:
在这里插入图片描述
也许你会认为它只会输出“string”,其实不然 ,它的输出结果如下图:
在这里插入图片描述
有上面的结论我们知道它是使用StringBuilder.append方法进行处理的,那么我们只需查询append的源码,便可得到结果,如下图
StringBuilder append源码
原来这是Java String对 null 对象的容错处理,它会把null拼接成了一个字符串,

三、循环体内为什么不建议字符串"+"

在这里插入图片描述
反编译后的内容如下:(字节码学习
在这里插入图片描述
这就是为什么每次循环都会 new 出一个 StringBuilder 对象的原因,也是导致“+”操作效率低的主要原因

四、总结

1、+两边连接的是字符串常量时,虚拟机会直接进行优化,看成一个字符串,当+的一边是引用的时候,虚拟机就会创建StringBuilder,利用append方法进行连接操作
2、+左右可以为null,并不会包空指针
3、从字节码来看“+”操作使用StringBuiler来拼接时,一行+ + +的语句只会创建一个StringBuilder
4、循环体内,有字符串的“+”操作时,推荐使用 StringBuilder

posted @ 2019-12-25 16:30  那些年的代码  阅读(460)  评论(0编辑  收藏  举报