Java开发手册中为什么不建议在for循环中使用“+“进行字符串操作

这篇具有很好参考价值的文章主要介绍了Java开发手册中为什么不建议在for循环中使用“+“进行字符串操作。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

场景

java开发手册中对于循环体中进行字符串的拼接要求如下:

【推荐】循环体内,字符串的连接方式,使用 StringBuilder 的 append 方法进行扩展。

说明:下例中,反编译出的字节码文件显示每次循环都会 new 出一个 StringBuilder 对象,然后进行 append操作,

最后通过 toString 方法返回 String 对象,造成内存资源浪费。

Java开发手册中为什么不建议在for循环中使用“+“进行字符串操作

并且还提供了反例:

   String str = "start";
    for (int i = 0; i < 100; i++) {
         str = str + "hello";
    }

Java中字符串占位替换、字符串拼接、字符串与Collection互转的方式:

Java中字符串占位替换、字符串拼接、字符串与Collection互转的方式_霸道流氓气质的博客-CSDN博客

字符串的拼接的几种方式可以参考上面的博客。

除了使用+拼接字符串之外,还可以使用 String 类中的方法 concat 方法来拼接字符串。

示例代码:

        String a = "a";
        String b = "b";
        String c = a.concat(b);
        System.out.println(c);

注:

博客:
霸道流氓气质的博客_CSDN博客-C#,架构之路,SpringBoot领域博主

下面看一下Java中String的concat方法的源码

        //    public String concat(String str) {
        //        int otherLen = str.length();
        //        if (otherLen == 0) {
        //            return this;
        //        }
        //        int len = value.length;
        //        char buf[] = Arrays.copyOf(value, len + otherLen);
        //        str.getChars(buf, len);
        //        return new String(buf, true);
        //    }

Java开发手册中为什么不建议在for循环中使用“+“进行字符串操作

首先创建一个字符数组,长度是已有字符串和待拼接字符串的长度之和,再把两个字符串的值复制到新的字符数组中,

并用这个字符数组创建一个新的String对象并返回。

为了验证上面for循环中让使用StringBuilder,而不让使用+,编写以下代码并对比耗时

        try(Cost cost = new Cost()){
            String aa = "aa";
            for (int i = 0; i < 100000; i++) {
               aa+="bb";
            }
        }

        try(Cost cost = new Cost()){
            StringBuilder aa = new StringBuilder();
            for (int i = 0; i < 100000; i++) {
                aa.append("bb");
            }
        }

耗时输出结果如下

        //cost:11565
        //cost:1

Java开发手册中为什么不建议在for循环中使用“+“进行字符串操作

 

注意这里的代码耗时统计的方式可以参考

Java实战-基于JDK的LRU算法实现、优雅的实现代码耗时统计(Spring AOP、AutoCloseable方式):

Java实战-基于JDK的LRU算法实现、优雅的实现代码耗时统计(Spring AOP、AutoCloseable方式)_霸道流氓气质的博客-CSDN博客

分析原因:

在for循环中,每次都是new了一个StringBuilder,然后再把String转成StringBuilder,再进行append。

而频繁的新建对象当然要耗费很多时间了,不仅仅会耗费时间,频繁的创建对象,还会造成内存资源的浪费。

为了验证以上原因,我们对使用+进行拼接字符串的代码进行反编译查看

Java开发手册中为什么不建议在for循环中使用“+“进行字符串操作 

总结:

经过对比,我们发现,直接使用StringBuilder的方式是效率最高的。

因为StringBuilder天生就是设计来定义可变字符串和字符串的变化操作的。

但是,还要强调的是:

 1.如果不是在循环体中进行字符串拼接的话,直接使用+就好了。

2.如果在并发场景中进行字符串拼接的话,要使用StringBuffer来代替StringBuilder文章来源地址https://www.toymoban.com/news/detail-472552.html

到了这里,关于Java开发手册中为什么不建议在for循环中使用“+“进行字符串操作的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • 为什么建议同时学多门编程语言

    晨读一本名叫《4点起床》的书,书中有一段描述与最近学习编制语言时自己的感受完全一致。算是一个小经验,分享给大家。 书中有一章的标题为《同时学六国语言记起来比较快》,其中有两段描述如下: 为什么我推荐大家同时学不同的语言呢?实不相瞒,我这几年在学西

    2024年02月10日
    浏览(15)
  • 为什么建议使用虚拟机来安装Linux?

    个人认为,通过虚拟机软件学习是初学者学习 Linux 的最佳方式。 在与部分初学者的交流中,我发现很多初学者都认为,学习 Linux 就必须将自己的电脑装成 Linux 系统或者必须要有真正的服务器设备。而实际上,这是一些机构、书籍或网络文章给大家传导的错误思想。 其实,

    2024年02月08日
    浏览(8)
  • 为什么idea建议使用“+”拼接字符串

    各位小伙伴在字符串拼接时应该都见过下面这种提示: 内容翻译:报告StringBuffer、StringBuilder或StringJoiner的任何用法,这些用法可以用单个java.lang.String串联来替换。使用字符串串联可以使代码更短、更简单。只有当得到的串联至少与原始代码一样高效或更高效时,此检查才会

    2024年02月06日
    浏览(13)
  • 为什么单片机上的程序不建议使用malloc?

    为什么单片机上的程序不建议使用malloc?

    做单片机研发前几年,一直没用过动态内存分配的功能,但是如果想成为软件架构设计师,这是绕不过的一道坎。 其实单片机很少使用c标准库自带的malloc()函数去动态分配内存,除非,你看老板不爽... 因为有缺陷,文章后面会提及。 一般是工程师借助现成的参考代码,然后

    2024年02月22日
    浏览(7)
  • 我为什么不建议使用框架默认的 DefaultMeterObservationHandler

    我为什么不建议使用框架默认的 DefaultMeterObservationHandler

    个人创作公约:本人声明创作的所有文章皆为自己原创,如果有参考任何文章的地方,会标注出来,如果有疏漏,欢迎大家批判。如果大家发现网上有抄袭本文章的,欢迎举报,并且积极向这个 github 仓库 提交 issue,谢谢支持~ 另外,本文为了避免抄袭,会在不影响阅读的情

    2024年01月21日
    浏览(9)
  • 为什么不建议企业用薪资系统来跟踪项目时间?

    为什么不建议企业用薪资系统来跟踪项目时间?

    身处在一个每分钟都很重要的世界里,企业必须勤于管理时间和工资。 虽然使用薪资系统进行时间跟踪似乎是一个实用的解决方案,但这种方法可能导致许多问题。 本文将讨论专用的时间跟踪软件对任何组织都必不可少的原因,以及依靠薪资系统进行时间管理可能产生的挑

    2024年02月12日
    浏览(27)
  • Go 语言为什么建议多使用切片,少使用数组?

    大家好,我是 frank,「Golang 语言开发栈」公众号作者。 01 介绍 在 Go 语言中,数组固定长度,切片可变长度;数组和切片都是值传递,因为切片传递的是指针,所以切片也被称为“引用传递”。 读者朋友们在使用 Go 语言开发项目时,或者在阅读 Go 开源项目源码时,发现很少

    2024年02月03日
    浏览(11)
  • 代码的坏味道(二)——为什么建议使用模型来替换枚举?

    在设计模型时,我们经常会使用枚举来定义类型,比如说,一个员工类 Employee,他有职级,比如P6/P7。顺着这个思路,设计一个 Level 类型的枚举: 假设哪天悲催的打工人毕业了,需要计算赔偿金,简单算法赔偿金=工资*工龄 后来,随着这块业务逻辑的演进,其实公司是家具备

    2024年02月08日
    浏览(12)
  • 为什么 IDEA 建议去掉 StringBuilder,而要使用 “+” 拼接字符串?

    为什么 IDEA 建议去掉 StringBuilder,而要使用 “+” 拼接字符串?

    作者:京东零售 姜波 来源:京东云开发者社区 各位小伙伴在字符串拼接时应该都见过下面这种提示: 内容翻译:报告StringBuffer、StringBuilder或StringJoiner的任何用法,这些用法可以用单个java.lang.String串联来替换。使用字符串串联可以使代码更短、更简单。只有当得到的串联至

    2024年02月05日
    浏览(15)
  • 编程开发8大语言详解,为什么Java是我最推荐的?

    编程开发8大语言详解,为什么Java是我最推荐的?

    很多没有接触过编程语言的同学,都会觉得编程开发特别高端和神奇,担心理解不了更担心学不会。 当然,也有人会认为,你既然是做编程的,那么你应该什么都会,什么软件的开发都能完成,这是平哥经常听到的两种声音。 在此,平哥需要给大家科普一下, 编程确实改变

    2024年02月05日
    浏览(6)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包