• 字符串"+"操作的原理


    字符串"+"操作的原理

    在阿里手册上意外的看到了一段关于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

  • 相关阅读:
    User-Agent大全
    Python yield 使用浅析
    解决Ubuntu终端里面显示路径名称太长
    百度搜索URL中的参数都是什么
    Fiddler 网页采集抓包利器__手机app抓包
    《samba服务配置的文本》
    《samba服务搭建》RHEL6
    《NFS文件共享服务的搭建》RHEL
    《shell脚本if..then..elif..then.if语句的总结》
    《shell条件测试语句,字符串测试apache是否开启》
  • 原文地址:https://www.cnblogs.com/zhuyeshen/p/12097431.html
Copyright © 2020-2023  润新知