首页 > 编程语言 >Java开发手册中为什么不建议在for循环中使用"+"进行字符串操作

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

时间:2023-06-05 19:12:57浏览次数:63  
标签:Java String StringBuilder 手册 拼接 str 字符串 new

场景

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

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

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

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

 

并且还提供了反例:

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

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

https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/130965385

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

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

示例代码:

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

注:

博客:
https://blog.csdn.net/badao_liumang_qizhi

下面看一下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);
        //    }

 

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

并用这个字符数组创建一个新的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实战-基于JDK的LRU算法实现、优雅的实现代码耗时统计(Spring AOP、AutoCloseable方式):

https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/130970242

分析原因:

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

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

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

 

总结:

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

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

但是,还要强调的是:

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

2.如果在并发场景中进行字符串拼接的话,要使用StringBuffer来代替StringBuilder

 

标签:Java,String,StringBuilder,手册,拼接,str,字符串,new
From: https://www.cnblogs.com/badaoliumangqizhi/p/17458718.html

相关文章

  • Locust用户手册
    Locust是一个基于Python语言的开源压力测试工具,通过模拟虚拟用户进行并发访问,测试目标站点的性能和稳定性。本手册详细介绍如何使用Locust进行压力测试,包括基础、高阶和拓展内容。一、基础使用1.安装Locust首先需要安装Python3,在命令行窗口输入以下命令:```pipinstalllocust......
  • 记录--JavaScript 中有趣的 9 个常用编码套路
    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助1️⃣set对象:数组快速去重常规情况下,我们想要筛选唯一值,一般会想到遍历数组然后逐个对比,或者使用成熟的库比如lodash之类的。不过,ES6带来了一个新玩意儿!它引入了一个全新的对象类型:Set!而且,如果结合上...展开运算符......
  • 详解JavaScript中的__proto__和prototype
    目录一、JS的对象创建方法二、双对象法则三、__proto__和prototypeprototype是什么?__proto__又是什么?对于JS来说,__proto__和prototype的区别是个绕不开的话题。本文就试图从它们的根本上说清楚它们是什么,又有什么区别,所以本文会从JS的对象开始说起,以其期待把本文的主题......
  • 算法——字符串(一)
    1、两数相加1classSolution{2publicListNodeaddTwoNumbers(ListNodel1,ListNodel2){3ListNodepre=newListNode();4ListNodecur=pre;5intcarry=0;6while(l1!=null||l2!=null||carry!=0){7......
  • Javascript之深入浅出递归思想
    Javascript之深入浅出递归思想 “递归”在生活中的一个典例就是“问路”。如图小哥哥进入电影院后找不到自己的座位,问身边的小姐姐“这是第几排”,小姐姐也不清楚便依次向前询问,问至第一排的观众后依次向后反馈结果,“我是第一排”,“我是第二排”,···,最终确定自己座位所在排数......
  • java
    1.1运行机制1.2数据类型()1.2.1强类型语言要求变量的使用严格符合规定,所以变量都必须先定义后才能使用弱类型语言与强类型相反1.2.2Java数据类型分为两大类基本类型(primitivetype)引用类型(referencetype)1.2.3基本数据类型(primitivetype)数值类型整数类......
  • 获取字符串个数和长度
    SAP中strlen()只能计算字符串的个数,不能计算含有中文字符串的长度。FIELD-SYMBOLS:<FV>TYPESTRING.DATA:LV_SRTTYPEI.DATA:LVTYPEREFTODATA.DATA:LV_SSSSTYPECHAR255.LV_SSSS='我'.START-OF-SELECTION.CREATEDATALVTYPESTRING.ASSIGNLV->*TO<FV&g......
  • Java开发手册中为什么要求三目运算符必须要注意类型对齐
    场景java开发手册中对于三目运算符的使用要求如下:【强制】三目运算符condition?表达式1:表达式2中,高度注意表达式1和2在类型对齐时,可能抛出因自动拆箱导致的NPE异常。说明:以下两种场景会触发类型对齐的拆箱操作:1)表达式1或表达式2的值只要有一个是原始类型......
  • C、C++、Java等控制汽车- 汽车引擎控制系统
    汽车代码的实现 - 汽车引擎控制系统汽车引擎控制系统是汽车代码中最重要的一部分之一。控制系统的目的是确保引擎在各种负载下运行顺畅,并最大程度地减少排放。控制系统的主要组成部分是ECU(电子控制单元),它是一种具有微处理器的电子设备,可接收传感器信号并控制汽车的各种功能,从燃......
  • 汽车代码的实现 - 车联网,需要Java、PHP、HTML、CSS
    汽车代码的实现 - 车联网车联网是另一个重要的汽车代码领域,它旨在将车辆、驾驶员和其他设备连接到互联网,以提高车辆性能和安全性,并实现大规模数据收集和分析。实现车联网需要使用多种编程语言和技术,如Java、PHP、HTML、CSS等。同时,还需要使用各种通信协议和技术,如Bluetooth、WIF......