“+”运算符进行字符串连接与调用StringBuffer/StringBuilder 对象的append方法连接字符的比较

ViViT视频分类实战:从Tubelet Embedding到4种Attention变体的保姆级解析 本文深入解析ViViT(Video Vision Transformer)在视频分类中的实战应用,重点介绍Tubelet Embedding技术和4种Attention变体的实现细节。通过对比分析Spatio-Temporal、Factorised Encoder等不同Attention机制的性能特点,提供工程优化策略和Kinetics数据集上的实战示例,帮助开发者掌握这一前沿视频理解技术。 阅读详情

原文链接:https://blog.youkuaiyun.com/chang384915878/article/details/79535708
字符串是Java程序中最常用的数据结构之一。在Java中String类已经重载了"+"。也就是说,字符串可以直接使用"+"进行连接,如下面代码所示:

]String s = “abc” + “ddd”;

但这样做真的好吗?当然,这个问题不能简单地回答yes or no。要根据具体情况来定。在Java中提供了一个StringBuilder类(这个类只在J2SE5及以上版本提供,以前的版本使用StringBuffer类),这个类也可以起到"+"的作用。那么我们应该用哪个呢?

下面让我们先看看如下的代码:

String s = "abc";
String ss = "ok" + s + "xyz" + 5;
System.out.println(ss);

上面的代码将会输出正确的结果。从表面上看,对字符串和整型使用"+"号并没有什么区别,但事实真的如此吗?下面让我们来看看这段代码的本质。

我们首先使用反编译工具(如jdk带的javap、或jad)将TestSimplePlus反编译成Java Byte Code,其中的奥秘就一目了然了。在本文将使用jad来反编译,命令如下:jad -o -a -s d.java TestSimplePlus.class

反编译后的代码如下:

    String s = "abc";
    String ss = (new StringBuilder("ok")).append(s).append("xyz").append(5).toString();
    System.out.println(ss);

读者可能看到上面的Java字节码感到迷糊,不过大家不必担心。本文的目的并不是讲解Java Byte Code,因此,并不用了解具体的字节码的含义。

使用jad反编译的好处之一就是可以同时生成字节码和源代码。这样可以进行对照研究。从上面的代码很容易看出,虽然在源程序中使用了"+",但在编译时仍然将"+"转换成StringBuilder。因此,我们可以得出结论,在Java中无论使用何种方式进行字符串连接,实际上都使用的是StringBuilder。

那么是不是可以根据这个结论推出使用"+“和StringBuilder的效果是一样的呢?这个要从两个方面的解释。如果从运行结果来解释,那么”+"和StringBuilder是完全等效的。但如果从运行效率和资源消耗方面看,那它们将存在很大的区别。

当然,如果连接字符串行表达式很简单(如上面的顺序结构),那么"+"和StringBuilder基本是一样的,但如果结构比较复杂,如使用循环来连接字符串,那么产生的Java Byte Code就会有很大的区别。先让我们看看如下的代码:

String s = "";
Random rand = new Random();
for (int i = 0; i < 10; i++){
	s = s + rand.nextInt(1000) + " ";
}
System.out.println(s);

上面的代码返编译后的Java Byte Code如下:

String s = "";
Random rand = new Random();
for(int i = 0; i < 10; i++)
    s = (new StringBuilder(String.valueOf(s))).append(rand.nextInt(1000)).append(" ").toString();
System.out.println(s);

大家可以看到,虽然编译器将"+"转换成了StringBuilder,但创建StringBuilder对象的位置却在for语句内部。这就意味着每执行一次循环,就会创建一个StringBuilder对象(对于本例来说,是创建了10个StringBuilder对象),虽然Java有垃圾回收器,但这个回收器的工作时间是不定的。如果不断产生这样的垃圾,那么仍然会占用大量的资源。解决这个问题的方法就是在程序中直接使用StringBuilder来连接字符串,代码如下:

Random rand = new Random();
StringBuilder result = new StringBuilder();
for (int i = 0; i < 10; i++){
	result.append(rand.nextInt(1000));
	result.append(" ");
}
System.out.println(result.toString());
上面代码反编译后的结果如下:

Random rand = new Random();
StringBuilder result = new StringBuilder();
for(int i = 0; i < 10; i++){
	result.append(rand.nextInt(1000));
	result.append(" ");
}
System.out.println(result.toString());

从上面的反编译结果可以看出,创建StringBuilder的代码被放在了for语句外。虽然这样处理在源程序中看起来复杂,但却换来了更高的效率,同时消耗的资源也更少了。

在使用StringBuilder时要注意,尽量不要"+"和StringBuilder混着用,否则会创建更多的StringBuilder对象,如下面代码所:

for (int i = 0; i < 10; i++){
	result.append(rand.nextInt(1000));
	result.append(" ");
}
改成如下形式:

for (int i = 0; i < 10; i++){     
    result.append(rand.nextInt(1000) + " ");
}
则反编译后的结果如下:

for(int i = 0; i < 10; i++){
	result.append((new StringBuilder(String.valueOf(rand.nextInt(1000)))).append(" ").toString());
}

从上面的代码可以看出,Java编译器将"+“编译成了StringBuilder,这样for语句每循环一次,又创建了一个StringBuilder对象。如果将上面的代码在JDK1.4下编译,必须将StringBuilder改为StringBuffer,而JDK1.4将”+"转换为StringBuffer(因为JDK1.4并没有提供StringBuilder类)。StringBuffer和StringBuilder的功能基本一样,只是StringBuffer是线程安全的,而StringBuilder不是线程安全的。因此,StringBuilder的效率会更高。

Manus创始人深度复盘:AI Agent产品的技术架构与战略转型 成本对比:同样任务处理,中国区单位成本是亚太区的2.3倍。付费转化率:中国区1.2% vs 全球平均4.7%微信/支付宝等超级App的适配代码占比达17%Zstandard:压缩比38%,耗时12ms。每季度需要投入3名高级工程师专职维护兼容性。国际版API平均延迟:180-220ms。中国版特殊部署延迟:480-720ms。信息保持准确率:93%(7天跨度测试)自研算法:压缩比39%,耗时5ms。存储效率:相比纯文本节省68%空间。:本地化部署导致的延迟与费用差异。LZ4:压缩比42%,耗时8ms。 阅读详情

相关推荐

企业级智能问数开发的核心痛点与技术聚焦

本文介绍了企业级智能问数系统开发的三大核心问题和解决方案:语义解析不精准、SQL生成不健壮、企业适配难落地。文章从开发者视角出发,详细拆解了NLU语义解析、SQL生成、对话记忆、企业级适配四大核心模块的技术实现。 在技术选型方面,推荐了LangChain+DeepSeek-R1、FAISS/Milvus、SQLAlchemy等工具链组合。针对企业级需求,重点讲解了: 语义解析模块的意图识别优化和要素提取技术 SQL生成模块的语法校验与性能优化方案 对话记忆模块的Redis存储实现 企业级适配的三层防护体系和

lamehsl的专栏 1046

在Java中连接字符串时是使用+号还是使用StringBuilder

    字符串是Java程序中最常用的一种数据结构之一。在Java中的String类已经重载了"+"。也就是说,字符串可以直接使用"+"进行连接,如下面代码所示:String s = "abc" + "ddd";但这样做真的好吗?当然,这个问题不能简单地回答yes or no。要根据具体情况来定。在Java中提供了一个StringBuilder类(这个类只在J2SE5及以上版本

我的新blog:<http://nokiaguy.blogjava.net> <http://nokiaguy.cnblogs.com> 9876

Matlab使用GitHub的踩坑记录(持续更新)

Matlab使用git的踩坑记录前言Matlab设置Git的官方帮助文档系统配置新建Git两种代码管理方式典型源代码管理SVN分布式源代码管理 Git注意:SVN和Git都可以用GitHub创建新的库 前言 作为Git初学者,对Git的代码版本管理非常非常喜欢,给了我极大的安全感。特别是想到之前的几次Matlab、Latex和python的代码莫名其妙被折腾没了又没法找回的悲剧,决定慢慢的走入gi...

voluntry的博客 7296

String 类的常用字符串方法

public class Page106 { /** * 字符串练习第五章 * @param args */ public static void main(String[] args) { String str=new String(" WOrld "); String str1=new Stri...

weixin_34248487的博客 243

海康VM加密狗无法识别常见问题排查

海康VM加密狗无法识别常见问题排查

视觉人机器视觉的博客 2704

用友U8其中一个账套提示演示期已到期-修复方法

【事件始末】 一朋友求助,反馈使用的用友U8,很多年了! 突然发现其中账套2021年的一个账套打不开,提示演示期限已到期! 但是其他账套完全正常,可以打开,没有任何问题。 不管是还原老旧备份,还是重装软件问题依旧,无法自己解决。 客户查询报表结算账期,情况比较紧急,于是求助我们。 经过多次反复琢磨和烟酒,终于于晚上23点59分给弄了出来,也总是圆满解决问题了。 【问题分析】 该用户打的是 U82X免狗补丁,估计是该补丁文件设置了 最大有效期,补丁到期了导致的。 也有可能是程序...

u010431289的博客 2万+

在for循环中字符串拼接一般使用StringBuffer.append()来代替String的运算符+

每次循环里的字符串+连接,都会新产生一个string对象,在java中,新建一个对象的代价是很昂贵的,特别是在循环语句中,效率较低。故在循环中一般使用StringBuffer.append来代替string的+运算符// This is bad  String s = "";  for (int i = 0; i &lt; field.length; ++i) {    s = s + field...

Mr_JK的专栏 1万+

AI游戏制作07——波次计时器,敌人按波次生成

AI游戏制作07——波次计时器,敌人按波次生成

qq_40572023的博客 47

Java中String类的+运算以及注意点

字符串的并置概念 String对象可以使用“+”进行并置运算,可以对“+”好两边的字符串进行首尾相接,最后得到一个新的String对象。 “+”运算的注意点 ①进行“+”运算中存在有变量 ②进行“+”运算的全是常量

蚩尤煜的博客 1123

TI Sitara系列AM64x开发板(双核ARM Cortex-A53)软硬件规格书

创龙科技TL64x-EVM是一款基于TI Sitara系列AM64x双核ARM Cortex-A53 + 单/四核Cortex-R5F + 单核Cortex-M4F多核处理器设计的高性能评估板,由核心板和评估底板组成。评估板接口资源丰富,引出5x Ethernet(两路支持TSN)、2x CAN-FD、多路UART、多路DI/DO、GPMC、PCIe、USB等接口,板载WIFI模块,支持4G/5G模块、NVME硬盘,可选配外壳直接应用于工业现场,方便用户快速进行产品方案评估与技术预研。

创龙,嵌入式一体化解决方案商 727

Cadence Orcad Capture原理图断线的检查与避免方法

在设计电路图中,尤其是直接借鉴别人的设计进行二次开发的过程中难免会遇到如下尴尬的情况。有没有眼神好的朋友发现图纸的哪里有不对劲的地方呢?

fydar的博客 3267

String拼接优化为StringBuilder.append

从jdk 5开始,Java就对String字符串的+操作进行了优化,该操作编译成字节码文件后会被优化为StringBuilder的append操作。 StringBuilder.append源码 @Override public StringBuilder append(Object obj) { return append(String.valueOf(obj)); ...

郝大侠的博客 1396

2023最新多文明策略手游《万国觉醒内购版》最新整理Linux商业手工服务端+安卓+详细搭建教程

2023最新多文明策略手游《万国觉醒内购版》最新整理Linux商业手工服务端+安卓+详细搭建教程。源码内置详细搭建教程,感兴趣可自行下载。

百创科技 1713

什么情况下用“+”运算符进行字符串连接比调用StringBuffer/StringBuilder 对象的append方法连接字符串性能更好?

字符串是Java程序中最常用的数据结构之一。在Java中String类已经重载了"+"。也就是说,字符串可以直接使用"+"进行连接,如下面代码所示:]String s = "abc" + "ddd";但这样做真的好吗?当然,这个问题不能简单地回答yes or no。要根据具体情况来定。在Java中提供了一个StringBuilder类(这个类只在J2SE5及以上版本提供,以前的版本使用String...

change的博客 1万+

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

什么情况下用“+” 运算符进行字符串连接比调用 StringBuffer/StringBuilder 对象的 append 方法连接字符串性能更好?

字符串是 Java 程序中最常用的数据结构之一。在 Java 中 String 类已经重载了"+"。也就是说,字符串可以直接 使用"+"进行连接,如下面代码所示: String s = "abc" + "ddd"; 但这样做真的好吗?当然,这个问题不能简单地回答 yes or no。要根据具体情况来定。在 Java 中提供了一个 StringBuilder 类(这个类只在 J2SE5 及以上版本...

Lcry 1924

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

华为:什么情况下用“+”运算符进行字符串连接比调用 StringBuffer/StringBuilder 对象的 append 方法连接字符串性能更好?

字符串是 Java 程序中最常用的数据结构之一。在 Java 中 String 类已经重载了"+"。但这样做真的好吗?当然,这个问题不能简单地回答 yes or no。要根据具体情况来定。在 Java 中提供了一个StringBuilder 类(这个类只在 J2SE5 及以上版本提供,以前的版本使用 StringBuffer 类),这个类也可以起到"+"的作用。那么我们应该用哪个呢?上面的代码将会输出正确的结果。从表面上看,对字符串和整型使用"+"号并没有什么区别,但事实真的如此吗?

2401_83384536的博客 794

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

什么情况下用+运算符进行字符串连接比调用StringBuffer/StringBuilder对象的append方法连接字符串性能更好?

如果在编写代码的过程中大量使用+进行字符串评价还是会对性能造成比较大的影响,但是使用的个数在1000以下还是可以接受的,大于10000的话,执行时间将可能超过1s,会对性能产生较大影响。如果有大量需要进行字符串拼接的操作,最好还是使用StringBuffer或StringBuilder进行。 String类的常用用法: public class StrTest { /**

sinat_32176267的博客 4466

JAVA为什么不建议在for循环中使用"+"进行字符串拼接,而是建议使用StringBuilder 的 append 方法?idea提示string concatenation ‘+=’in loop

1. 如果不是在循环体中进行字符串拼接的话,直接使用+就好了。 2. 如果在并发场景中进行字符串拼接的话,要使用StringBuffer来代替StringBuilder。在for循环中,每次都是new了一个StringBuilder,然后再把String转成StringBuilder,再进行append。 而频繁的新建对象当然要耗费很多时间了,不仅仅会耗费时间,频繁的创建对象,还会造成内存资源的浪费。 我为什么在for循环外写`str=str+"a"+"b";`,是为了告诉大家,不是一个`”+“`就创建一个

子浩的博客 2万+

“+”运算符进行字符串连接和 StringBuffer/StringBuilder对象的 append 方法连接字符串的区别?

字符串是 Java 程序中最常用的数据结构之一。在 Java 中 String 类已经重载了"+"。也就是说,字符串可以直接使用"+"进行连接,如下面代码所示: 1.String str = "abc" + "abc"; 在 Java 中提供了一个StringBuilder 类,这个类也可以起到"+"的作用。那么这两种方法有什么区别呢? 看看如下的代码: 1. package string; 2. 2. public class Test 3. { 4. public static void main(S

weixin_50594210的博客 603

Java中使用StringBuffer拼接字符串

1、StringBuffer类 StringBuffer用于表示可以修改的字符串。只要将连接运算符(+)与字符串一起使用,就会自动创建StringBuffer对象。 StringBuffer类的构造方法: 构造方法 说明 public StringBuffer() 保留16个字符的空间。 public StringBuffer(int capacity) 设置缓存器...

pan_junbiao的博客 2万+

字符串拼接的效率对比:StringBuilder vs. StringBuffer vs. “+“运算符

3. `StringBuffer`:`StringBuffer` 与 `StringBuilder` 类似,也是可变的字符串序列,但它是线程安全的。2. `StringBuilder`:`StringBuilder` 是可变的字符串序列,它提供了高效的字符串拼接操作。1. "+"运算符:使用"+"运算符进行字符串拼接是最简单的方式,但它在每次拼接时都会创建一个新的字符串对象。在Java中,字符串拼接可以使用三种方式:`StringBuilder`、`StringBuffer`和"+"运算符。

m0_75198698的博客 817

什么情况下用+运算符进行字符串连接比调用StringBuilder对象的append方法连接字符串性能更好?

经常在网上看到或者在周围听到有人说字符串拼接不要直接用 String 相加, StringBuilder 的效率要比 S...

itTalmud的博客 544

String、StringBuffer、StringBuilder

摘要:本文介绍了Java中字符串处理的三个核心类:String、StringBuffer和StringBuilder。String类表示不可变字符串,提供获取、转换、判断和比较等方法;StringBuffer是线程安全的可变字符串序列,支持增删改查操作;StringBuilder是StringBuffer的非线程安全版本,执行效率更高。文章详细说明了各类的构造方法和常用API,并通过示例演示了字符串拼接、反转等操作。最后比较了三者在线程安全、可变性和效率上的区别.

Rou_bao的博客 2239

Java中StringBuilder和StringBuffer的append(Object obj)方法使用

使用字符串String连接,方式有以下几种方式 1、用 “+” 加号连接字符串,如 String s = String0 + String1 + String2 + String3 + String4;  这里使用反编译工具,最终发现代码也是通过StringBuilder.append(连接)     2、使用 “+=” String s = new String(); s +=...

iteye_8188的博客 1065

+与append连接两个字符串的区别

java中的+与append函数 Java中的+与append都可以对字符串类型的对象进行追加,那么这两个又有什么区别呢? 博文http://blog.youkuaiyun.com/shirleyacount/article/details/39958371 中有具体的描述,相信看过之后,就会明白了。 以下是append方法的API 可以看到append方法返回的值均为StringBuffer类型...

fengwenguang130733的博客 897
上一篇: 给一个数据库表,ID、score两个字段分别代表学生ID和成绩,写SQL语句求ID=?的学生排第几名?
下一篇: Java二叉树的创建以及遍历
少年不再NianShao
博客等级 码龄8年 8粉丝 25原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值