为什么idea建议使用“+”拼接字符串

今天在敲代码的时候,无意间看到这样一个提示:

英文不太好,先问问ChatGPT,这个啥意思?

IDEA 提示你,可以将代码中的 StringBuilder 替换为简单的字符串连接方式。

提示信息中说明了使用 StringBuilder 进行字符串拼接在现代 JVM 中并不一定比使用 String 连接有显著的性能优势,尤其是对于简单的字符串拼接操作,直接使用 String 连接可能更加简洁明了。

可以被替换为:

String str = "哪吒编程" + "study" + "ChatGPT4o";

这样可以使代码更简洁,同时在大多数情况下不会对性能产生明显的负面影响。

IDEA 提供了自动替换的选项,点击提示框中的 “Replace ‘StringBuilder’ with ‘String’” 即可自动进行替换。

👉 GPT功能:

  1. GPT-4o知识问答:支持1000+token上下文记忆功能
  2. 最强代码大模型Code Copilot:代码自动补全、代码优化建议、代码重构等
  3. DALL-E AI绘画:AI绘画 + 剪辑 = 自媒体新时代
  4. 私信哪吒,直接使用GPT-4o

在这里插入图片描述

实际上,从JDK1.5开始,Java编译器就做了自动优化,使用“+”拼接字符串,编译器编译后自动优化为使用StringBuilder。

做一个小测试,拼接10000个"哪吒编程" + "study" + "ChatGPT4o",看下使用“+”拼接字符串和使用StringBuilder,哪个速度快。

public class StringTest {public static void main(String[] args) throws IOException {
//        long timeSum = 0;
//        for (int i = 0; i < 3; i++) {
//            timeSum += spliceStrByAdd();
//        }
//        System.out.println("使用+拼接字符串平均耗时: " + timeSum/3 +"毫秒");long timeSum = 0;for (int i = 0; i < 3; i++) {timeSum += spliceStrByBuilder();}System.out.println("使用StringBuilder拼接字符串平均耗时: " + timeSum / 3 + "毫秒");}private static final int n = 10000;/*** 使用+拼接字符串** @return*/private static long spliceStrByAdd() {Instant start = Instant.now();String ret = "";for (int i = 0; i < n; i++) {ret += "哪吒编程" + i;ret += " study" + i;ret += " ChatGPT4o" + i;}Instant end = Instant.now();Duration elapsed = Duration.between(start, end);long time = elapsed.toMillis();System.out.println("使用+拼接字符串耗时: " + time + "毫秒");return time;}/*** 使用StringBuilder拼接字符串*/private static long spliceStrByBuilder() {Instant start = Instant.now();StringBuilder builder = new StringBuilder();for (int i = 0; i < n; i++) {builder.append("哪吒编程").append(i);builder.append(" study").append(i);builder.append(" ChatGPT4o").append(i);}Instant end = Instant.now();Duration elapsed = Duration.between(start, end);long time = elapsed.toMillis();System.out.println("使用StringBuilder拼接字符串耗时: " + time + "毫秒");return time;}
}

这差距还真是巨大,相差1000倍,Idea给的提示这不是胡扯嘛?

上面还说,jdk1.5开始,+在编译时自动优化为StringBuilder,现在我用jd-gui对class文件进行反编译,查看编译后的代码差异。

这个时候,很多杠精就该站出来了,你这测试有问题,不能这么干

你这循环拼接10000次,通过+拼接时,你就创建了10000个字符串,你这测试的并不是纯+拼接耗时!!!

好像说的有点道理~

public class StringTest2 {public static void main(String[] args) throws IOException {long timeSum = 0;for (int i = 0; i < 3; i++) {timeSum += spliceStrByAdd();}System.out.println("使用+拼接字符串平均耗时: " + timeSum/3 +"毫秒");timeSum = 0;for (int i = 0; i < 3; i++) {timeSum += spliceStrByBuilder();}System.out.println("使用StringBuilder拼接字符串平均耗时: " + timeSum / 3 + "毫秒");}private static final int n = 10000;/*** 使用+拼接字符串** @return*/private static long spliceStrByAdd() {Instant start = Instant.now();for (int i = 0; i < n; i++) {String ret = "哪吒编程" + i + " study" + i+" ChatGPT4o" + i;}Instant end = Instant.now();Duration elapsed = Duration.between(start, end);long time = elapsed.toMillis();System.out.println("使用+拼接字符串耗时: " + time + "毫秒");return time;}/*** 使用StringBuilder拼接字符串*/private static long spliceStrByBuilder() {Instant start = Instant.now();for (int i = 0; i < n; i++) {StringBuilder builder = new StringBuilder();builder.append("哪吒编程").append(i);builder.append(" study").append(i);builder.append(" ChatGPT4o").append(i);}Instant end = Instant.now();Duration elapsed = Duration.between(start, end);long time = elapsed.toMillis();System.out.println("使用StringBuilder拼接字符串耗时: " + time + "毫秒");return time;}
}

使用+和StringBuilder单独拼接字符串时,效率上确实差不多少!

也就是说,在拼接少量字符串的时候,使用+也是可以的,Idea的提示还是有点道理的!

我把这两个class和idea提示截图直接传给ChatGPT,看它怎么看待这个问题。

ChatGPT,牛笔!

👉 GPT功能:

  1. GPT-4o知识问答:支持1000+token上下文记忆功能
  2. 最强代码大模型Code Copilot:代码自动补全、代码优化建议、代码重构等
  3. DALL-E AI绘画:AI绘画 + 剪辑 = 自媒体新时代
  4. 私信哪吒,直接使用GPT-4o

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

独孤思维:长线副业,越做越香

01 独孤从开始做第一个短视频开始&#xff0c;就做好了长线作战的准备。 IP的短视频&#xff0c;尤其是如今这么卷的情况下&#xff0c;独孤并不期望短时间内涨粉&#xff0c;甚至变现。 还是站在长期主义角度上&#xff0c;去看到短视频。 就如同&#xff0c;独孤做日更写…

nodejs的mysql事务,行锁,表锁

使用事务&#xff08;Transactions&#xff09;&#xff1a; 在 MySQL 中&#xff0c;事务&#xff08;Transaction&#xff09;可以确保一组操作要么全部成功&#xff0c;要么全部失败和回滚&#xff0c;从而保持数据的一致性。使用 connection.beginTransaction() 开始事务&a…

Android APP 音视频(01)MediaCodec解码H264码流

说明&#xff1a; 此MediaCodec解码H264实操主要针对Android12.0系统。通过读取sd卡上的H264码流Me获取视频数据&#xff0c;将数据通过mediacodec解码输出到surfaceview上。 1 H264码流和MediaCodec解码简介 1.1 H264码流简介 H.264&#xff0c;也被称为MPEG-4 AVC&#xff…

SCADA系统智能化管理工厂 操作方便易于使用

SCADA系统是将工厂进行智能化升级的专业系统&#xff0c;可根据需求与预算定制&#xff0c;从多设备的采集、数据的显示、数据可视化展示、分析图像、边缘计算、协议解析、数据转发、数据清洗、数据转换、数据存储、数据传输等等&#xff0c;各种功能均可根据实际需求进行定制&…

如何在测试中保护用户隐私!

在当今数据驱动的时代&#xff0c;用户隐私保护成为了企业和开发团队关注的焦点。在软件测试过程中&#xff0c;处理真实用户数据时保护隐私尤为重要。本文将介绍如何在测试中保护用户隐私&#xff0c;并提供具体的方案和实战演练。 用户隐私保护的重要性 用户隐私保护不仅是法…

Spring MVC 应用分层

1. 类名使⽤⼤驼峰⻛格&#xff0c;但以下情形例外&#xff1a;DO/BO/DTO/VO/AO 2. ⽅法名、参数名、成员变量、局部变量统⼀使⽤⼩驼峰⻛格 3. 包名统⼀使⽤⼩写&#xff0c;点分隔符之间有且仅有⼀个⾃然语义的英语单词. 常⻅命名命名⻛格介绍 ⼤驼峰: 所有单词⾸字⺟…

centos7 mysql 基本测试(7)主从并行简单测试

centos7 mysql 基本测试&#xff08;7&#xff09;主从并行简单测试 重启MySQL服务使配置生效。 注意&#xff1a;并行复制需要slave的硬件资源充足&#xff0c;并且确保网络通信和IO性能不是瓶颈。不是所有的应用场景都适合并行复制&#xff0c;比如写密集型应用或者slave负…

使用api 调试接口 ,配置 Header 、 body 远程调试 线上接口

学习目标&#xff1a; 目标 使用api 调试接口 &#xff0c;配置 Header 、 body 远程调试 线上接口 学习内容&#xff1a; 内容 设置请求方式 2. 选择 POST 提交 3.设置 Header 一般默认的 4个 header 属性就可以直接使用&#xff0c;如有特殊情况&#xff0c;需进行属性设…

『 Linux 』信号的捕捉及部分子问题

文章目录 信号的捕捉sigaction函数未决信号集的置零时机信号处理过程的阻塞可重入函数volatile 关键字SIGCHLD 信号 信号的捕捉 该图为基于信号处理为用户自定义动作的图解; 信号的捕捉 当一个信号被递达时,如果该信号的处理动作是用户自定义的函数(如int sighandler(int))时就…

【AWS基础】AWS服务介绍与基本使用

AWS基础&#xff1a;AWS服务介绍与基本使用 目录 引言AWS概述AWS的核心服务 计算服务存储服务数据库服务网络服务管理和监控服务 AWS的基本使用 创建AWS账户使用EC2实例使用S3存储配置RDS数据库设置VPC网络 AWS的优势AWS的应用场景结论 引言 亚马逊网络服务&#xff08;AWS&…

文物实时状态监控的保护系统

文物是宝贵的历史遗产和文化瑰宝&#xff0c;其保护是我们共同的责任。为了实现文物的安全保护&#xff0c;现代科技提供了各种环境监测设备&#xff0c;可以实时监控文物的状态并采取相应的保护措施。本文将介绍一种利用各种环境监测设备实现文物实时状态监控的保护系统。 一…

【视频讲解】ResNet深度学习神经网络原理及其在图像分类中的应用|附Python代码

全文链接&#xff1a;https://tecdat.cn/?p37134 原文出处&#xff1a;拓端数据部落公众号 分析师&#xff1a;Canglin Li 本文深入探讨了卷积层&#xff08;Convolutional Layer&#xff09;在深度学习框架中的核心作用与操作机制&#xff0c;并分析了其在特征提取、网络构…

近期代码报错解决笔记

1.TypeError: ‘bool’ object is not callable 想print("Type of head:", type(entity_emb[head]))&#xff0c;结果报如下错误&#xff1a; 源代码&#xff1a; 因为 print 仍然被当作一个布尔值处理&#xff0c;而不是作为函数调用。这个问题的根源在于 print …

Android SurfaceFlinger——纹理的绘制流程(二十八)

在系统开机动画的播放流程中,会从给定的资源文件中加载纹理数据并初始化一个 OpenGL 纹理对象,这里我们就来解析软件模拟纹理的绘制流程。 一、纹理概述 在 Android 的 SurfaceFlinger 系统组件中,纹理(Texture)是一个核心概念,特别是在涉及到图形渲染和显示的过程中。 …

关于TS(typescript)的理论知识

关于TS&#xff08;typescript&#xff09;的理论知识 TypeScript 是一种由微软开发的开源编程语言&#xff0c;它是 JavaScript 的一个超集&#xff0c;添加了可选的静态类型和基于类的面向对象编程。TypeScript 最终会被编译成纯 JavaScript 代码&#xff0c;以便在任何支持 …

Adobe Photoshop(Ps)安装包软件下载

一、Adobe Photoshop简介 Adobe Photoshop&#xff08;简称PS&#xff09;是由Adobe Systems公司开发的图像处理软件&#xff0c;它是一款集图像扫描、编辑修改、图像制作、广告创意、图像输入与输出于一体的图形图像处理软件。广泛应用于专业测评、平面设计、广告摄影、影像创…

MongoDB多数据源配置与切换

在MongoDB中配置和使用多数据源主要涉及以下几个步骤&#xff1a; 定义多个数据源的配置&#xff1a; 在应用程序的配置文件中&#xff0c;定义多个MongoDB的数据源&#xff0c;例如在Spring Boot中可以通过application.yml或application.properties文件进行配置。 创建多个Mo…

学习小型gpt源码(自用)

数据集构建_哔哩哔哩_bilibili &#xff08;b站上有一系列课&#xff0c;从数据处理到模型构建和训练使用&#xff09; 什么是batch&#xff1f; 为什么一个batch内的句子要一样长&#xff1f; 不同batch的长度可以不一样&#xff0c;但是同一个batch内长度一样&#xff01;…

【MySQL进阶之路 | 高级篇】数据操作类型的角度理解共享锁,排他锁

1. 从数据操作的类型划分&#xff1a;读锁&#xff0c;写锁 对于数据库并发事务的读-读情况并不会引起什么问题。对于写-写&#xff0c;读-写操作或写-写操作这些情况可能会引起一些问题&#xff0c;需要使用MVCC或者加锁的方式来解决它们。在使用加锁的方式解决问题时&#x…

Vue3点击按钮实现跳转页面并携带参数

前提&#xff1a;有完整的路由规则 1.源页面 <template><div><h1>源页面</h1><!--通过js代码跳转--><template #default"scope"><button click"toTargetView(scope.row)">点击跳转携带参数</button><…