Intellij建议用String替换StringBuilder

文章目录

    • 前言
    • String 和 StringBuilder 性能对比
    • String 和 StringBuilder 使用的字节码对比
    • 总结

本文收发地址 https://blog.csdn.net/CSqingchen/article/details/135324313
最新更新地址 https://gitee.com/chenjim/chenjimblog

前言

最近编码时看到 Intellij 建议使用 String 替换 StringBuilder ,不是应该推荐 StringBuilder 嘛?

在 jetbrains 上也有对此问题的讨论,链接如下
https://intellij-support.jetbrains.com/hc/en-us/community/posts/115000093250


String 和 StringBuilder 性能对比

准备一段测试代码如下

public static void main(String[] args) {
    String input = "ABCDEF";
    String append = ",AP,";

    Instant start = Instant.now();
    String out = "oo";
    System.out.println(start);

    start = Instant.now();
    for (int i = 0; i < 10000; i++) {
        out = input + append;
    }
    System.out.println(out + Duration.between(start, Instant.now()).toNanos());

    start = Instant.now();
    for (int i = 0; i < 10000; i++) {
        StringBuilder sb = new StringBuilder();
        out = sb.append(input).append(append).toString();
    }
    System.out.println(out + Duration.between(start, Instant.now()).toNanos());
}

提供运行,结果如下

ABCDEF,AP,2999000
ABCDEF,AP,1999600

发现效率并没有相差太大

String 和 StringBuilder 使用的字节码对比

我们使用 javap -c abc.class 看一下如上代码执行的字节码

    30: sipush        10000
    33: if_icmpge     51
    36: aload_1
    37: aload_2
    38: invokedynamic #31,  0             // InvokeDynamic #0:makeConcatWithConstants:(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
    43: astore        4
    45: iinc          5, 1
    48: goto          28
    51: getstatic     #19                 // Field java/lang/System.out:Ljava/io/PrintStream;
    ....
    83: sipush        10000
    86: if_icmpge     119
    89: new           #51                 // class java/lang/StringBuilder
    92: dup
    93: invokespecial #53                 // Method java/lang/StringBuilder."<init>":()V
    96: astore        6
    98: aload         6
    100: aload_1
    101: invokevirtual #54                 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;     
    104: aload_2
    105: invokevirtual #54                 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;     
    108: invokevirtual #58                 // Method java/lang/StringBuilder.toString:()Ljava/lang/String;
    111: astore        4
    113: iinc          5, 1
    116: goto          81
    119: getstatic     #19                 // Field java/lang/System.out:Ljava/io/PrintStream;

通过对比可以看到,使用 StringBuilder 执行更多指令
String 只需要 makeConcatWithConstants 拼接即可
StringBuilder 需要多构建一个对象,并最终 toSring(),如果忽略这两个指令,效率理论是差不多的。

总结

通过上面分析,两者拼接字符并没有太大性能差异,
使用 + 有更好的可读性,所以 Intellij 建议也比较合理
如果是涉及字符的大量操作,比如如下场景,还是建议使用 StringBuilder ,可以减少许多新对象的生成。

    start = Instant.now();
    for (int i = 0; i < 10000; i++) {
        out = out + i;
    }
    System.out.println(out.length() + "," + Duration.between(start, Instant.now()).toNanos());

    start = Instant.now();
    StringBuilder sb = new StringBuilder();
    for (int i = 0; i < 10000; i++) {
        sb.append(input).append(append);
    }
    out = sb.toString();
    System.out.println(out.length() + "," + Duration.between(start, Instant.now()).toNanos());


不建议在循环中使用 + 拼接字符


本文到此结束,如果有相关问题,欢迎留言讨论。
如果你觉得本文还不错,可以点赞+收藏。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/283582.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

2023-12-15 LeetCode每日一题(反转二叉树的奇数层)

2023-12-15每日一题 一、题目编号 2415. 反转二叉树的奇数层二、题目链接 点击跳转到题目位置 三、题目描述 给你一棵 完美 二叉树的根节点 root &#xff0c;请你反转这棵树中每个 奇数 层的节点值。 例如&#xff0c;假设第 3 层的节点值是 [2,1,3,4,7,11,29,18] &…

认识数据挖掘

随着数据库技术的迅速发展及数据库管理系统的广泛应用&#xff0c;人们积累的数据越来越多。激增的数据背后隐藏着许多重要的信息&#xff0c;人们希望能够对其进行更高层次的分析&#xff0c;以便更好地利用这些数据。目前的数据库系统可以高效地实现数据的录入、查询、统计等…

操作系统(Operator System)

这里写目录标题 1. 什么是操作系统2. 主要功能3. 计算机的层状结构4. 什么叫做管理5. 总结6. 为什么要有操作系统7. 最后 1. 什么是操作系统 操作系统&#xff08;英语&#xff1a;Operating System&#xff0c;缩写&#xff1a;OS&#xff09;是一组主管并控制计算机操作、运…

Debezium日常分享系列之:向 Debezium 连接器发送信号

Debezium日常分享系列之&#xff1a;向 Debezium 连接器发送信号 一、概述二、激活源信号通道三、信令数据集合的结构四、创建信令数据集合五、激活kafka信号通道六、数据格式七、激活JMX信号通道八、自定义信令通道九、Debezium 核心模块依赖项十、部署自定义信令通道十一、信…

【理论】STM32定时器时间计算公式 +【实践】TIM中断1s计时一次

前言&#xff1a;定时器TIM的详细知识点见我的博文&#xff1a;11.TIM定时中断-CSDN博客 STM32定时器时间计算公式 公式解释&#xff1a; ARR&#xff08;TIM_Period&#xff09;&#xff1a;自动重装载值&#xff0c;是定时器溢出前的计数值 PSC&#xff08;TIM_Prescaler&…

初始SpringBoot:详解特性和结构

&#x1f3e1;浩泽学编程&#xff1a;个人主页 &#x1f525; 推荐专栏&#xff1a;《深入浅出SpringBoot》《java项目分享》 《RabbitMQ》《Spring》《SpringMVC》 &#x1f6f8;学无止境&#xff0c;不骄不躁&#xff0c;知行合一 文章目录 前言一、SpringBoot…

骑砍MOD天芒传奇-前言

基于少年包青天3-天芒传奇开发的MOD,故事发生在北宋仁宗年间,玩家需要代替包拯寻找天芒,最终完成统一大业.开局可尝试使用暴雨梨花针神器. MOD下载地址:霸王•吕布 / pellets of legend GitCodehttps://gitcode.net/qq_35829452/1-mod 效果演示:骑砍1战团mod天芒传奇-重出江湖…

车载电子电器架构 —— 电子电气系统功能开发

车载电子电器架构 —— 电子电气系统功能开发 我是穿拖鞋的汉子&#xff0c;魔都中坚持长期主义的汽车电子工程师。 老规矩&#xff0c;分享一段喜欢的文字&#xff0c;避免自己成为高知识低文化的工程师&#xff1a; 屏蔽力是信息过载时代一个人的特殊竞争力&#xff0c;任何…

js遍历后端返回的集合将条件相同的放入同一个数组内

项目场景&#xff1a; echarts折线图需要根据条件动态展示多条不同曲线 解决方案&#xff1a; 后端直接将使用sql将数据查询出来返回即可,因为我这里不是Java使用的C#不是很熟练后台不好写逻辑,所以在前端js完成的 代码如下: function createline(villagename, buildingname…

微服务篇之Nacos快速入门

Nacos 简介 Nacos 起源 Nacos 起源于阿里巴巴 2008 年的五彩石项目&#xff08;完成微服务拆分和业务中台建设&#xff09;&#xff0c;经历了阿里十年双十⼀的洪峰流量的考验&#xff0c;沉淀了简单易用、稳定可靠、性能卓越等核心特性。随着云计算的兴起和受到开源软件行业…

ThinkPad产品如何升级BIOS程序

操作步骤: 重要提示&#xff1a; 更新BIOS存在风险&#xff01;如果您的电脑在此过程中出现死机&#xff0c;系统崩溃或断电&#xff0c;则BIOS或UEFI固件程序可能会损坏&#xff0c;这将使您的电脑无法启动。 由于BIOS的版本或者在升级过程中出错&#xff0c;可能会造成不可…

009、引用

1. 引用与借用 下面的示例重新定义了一个新的 calculate_length 函数。与之前不同的是&#xff0c;新的函数签名使用了 String 的引用作为参数而没有直接转移值的所有权&#xff1a; fn main() { let s1 String::from("hello"); let len calculate_length(&s1…

气象预报与计算机技术:深度融合与未来展望

气象预报与计算机技术:深度融合与未来展望 一、引言 气象预报,作为人类对自然界气象变化的探索与预测,随着时间的推移和技术的进步,已经逐渐从单纯的经验模式转变为依赖于精密的仪器与强大的计算机技术的科学预测。在本文中,我们将深入探讨气象预报与计算机技术之间的密…

[2024区块链开发入门指引] - 比特币与区块链诞生

一份为小白用户准备的免费区块链基础教程 工欲善其事,必先利其器 Web3开发中&#xff0c;各种工具、教程、社区、语言框架.。。。 种类繁多&#xff0c;是否有一个包罗万象的工具专注与Web3开发和相关资讯能毕其功于一役&#xff1f; 参见另一篇博文&#x1f449; 2024最全面…

数据结构:堆的三部曲 (一)堆的实现

堆的实现 1.堆的结构1.1堆的定义理解 2.堆的实现&#xff08;以小根堆为例&#xff09;2.1 堆结构体的定义2.2 堆的插入交换函数向上调整算法插入函数的代码 2.3 堆的删除向下调整算法&#xff1a;删除函数的代码&#xff1a; 2.4其他操作 3.测试以及完整源代码实现3.1测试代码…

山西电力市场日前价格预测【2024-01-02】

日前价格预测 预测说明&#xff1a; 如上图所示&#xff0c;预测明日&#xff08;2024-01-02&#xff09;山西电力市场全天平均日前电价为92.93元/MWh。其中&#xff0c;最高日前电价为275.90元/MWh&#xff0c;预计出现在18:00。最低日前电价为0.00元/MWh&#xff0c;预计出现…

【数据结构与算法】第1章绪论(头歌习题)【合集】

文章目录 第1关&#xff1a;求和任务描述编程要求代码 第2关&#xff1a;求倒数和的倒数任务描述编程要求完整代码 第3关&#xff1a;回文数任务描述编程要求完整代码 第4关&#xff1a;求素数个数任务描述编程要求完整代码 第5关&#xff1a;最大因子任务描述编程要求完整代码…

第6课 用window API捕获麦克风数据并加入队列备用

今天是2024年1月1日&#xff0c;新年的第一缕阳光已经普照大地&#xff0c;祝愿看到这篇文章的所有程序员或程序爱好者都能在新的一年里持之以恒&#xff0c;事业有成。 今天也是我加入CSDN的第4100天&#xff0c;但回过头看一看&#xff0c;这么长的时间也没有在CSDN写下几篇…

2023-刻苦自励,2024-奋起直追!

点击上方“嵌入式应用研究院”&#xff0c;选择“置顶/星标公众号” 干货福利&#xff0c;第一时间送达&#xff01; 来源 | 嵌入式应用研究院 整理&排版 | 嵌入式应用研究院 一、引言 时光如影&#xff0c;岁月如梭。转眼之间&#xff0c;2023年已经过去&#xff0c;在这一…

拒绝采样(算法)总结

先说说什么是拒绝采样算法&#xff1a;就类似于数学上的求阴影面积的方法&#xff0c;直接求求不出来&#xff0c;就用大面积 - 小面积 阴影面积的办法。 所谓拒绝 和 采样 &#xff1a;就像是撒豆子计个数&#xff0c;计算概率问题一样&#xff0c;大桶里面套小桶&#xff0c…