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

2025年度工业级3D全景相机技术解析选型参考:国产品牌的技术突围与市场格局 本文分析了工业级3D相机在智慧城市和建筑数字化中的应用。通过对比国内外主流设备的技术参数和应用场景,发现国产品牌如众趣科技在性价比和本地化服务方面具有优势,尤其适合大型空间扫描项目;而国际品牌如Faro、Leica则在精度和可靠性上保持领先。建议根据项目需求(如测距范围、精度要求、预算)进行设备选型,综合考虑扫描效率、数据处理能力和系统兼容性。国产品牌已在国内大型基建项目中展现出竞争力,国际品牌则更适合高精度逆向工程和国际化项目。 阅读详情

原文链接: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的效率会更高。

Android 15.0 app进程保活白名单功能实现 在15.0的系统rom产品开发中,在某些重要的app即使进入后台,产品需求要求也不想被系统杀掉进程,需要app长时间保活,就是app进程保活白名单功能的实现, 所以需要在系统杀进程的时候不杀掉白名单的进程,接下来就看怎么样来实现这些功能 阅读详情

相关推荐

使用 Python 获取网络数据

本文介绍了 Python 获取网络数据、使用 requests 库、编写爬虫代码以及使用 IP 代理的方法。Python 的 requests 库非常方便,可以帮助我们快速访问网络资源。编写爬虫程序需要掌握正则表达式、HTTP 协议等知识,同时需要注意爬取速度和频率,以避免对被爬取网站造成负担。最后,使用 IP 代理可以帮助我们隐匿身份,保护我们的网络安全。

互联说 2695

在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

医用超声图像模拟系统算法:空间分辨率详解

医用超声图像模拟系统中的空间分辨率,是连接物理原理、信号处理算法和最终图像质量的桥梁。通过精确模拟从声场发射、组织相互作用到信号接收和图像重建的全链条过程,并运用先进的波束形成、解卷积和超分辨率算法,我们可以不断逼近并突破物理极限,为开发下一代高分辨率超声成像系统提供强大的算法验证平台和数据集来源。未来的趋势将是更高保真度的物理模拟、更智能的自适应算法与数据驱动方法的深度融合。

alxraves的博客 702

String 类的常用字符串方法

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

weixin_34248487的博客 243

Unity Android构建报错:compileSdk 35兼容性五层定位法

Android构建中的compileSdk是编译时API目标版本,其升级并非孤立操作,而是触发JDK、Android Gradle Plugin(AGP)、NDK、targetSdk与Unity引擎版本之间强耦合校验的起点。当出现'using a newer Android Gradle plugin to use compileSdk = 35'类报错,本质是代际技术栈错配——例如AGP 7.1.3不识别compileSdk 35所需Java 17语法,或NDK 21与AGP 7.4的ABI规范冲突。该问

weixin_32496547的博客 568

Stable Diffusion 模型分享:Beautiful Realistic Asians(美丽真实的亚洲人)

Beautiful Realistic Asians(BRA)模型是由作者自己训练而成的一个独立模型,它是一个真实模型,并且是一个针对亚洲人训练的模型,可以生成非常漂亮的亚洲小姐姐。条目内容类型大模型基础模型SD 1.5来源CIVITAI作者文件名称文件大小1.99GB。

水滴的博客 2156

在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万+

软考备考:《系统规划与管理师教程》(第2版)第2章——数字ZG与数智化发展

🔴数字化转型的定义:数字化转型是建立在数字化转换、数字化升级基础上,进一步触及组织核心业务,以新建一种业务模式为目标的高层次转型。

✨ 欢迎来到【Seal ^_^ 的优快云博客】!✨ 960

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

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

蚩尤煜的博客 1123

(2)NPW(监控片)【中】---业务场景精讲

自己在日常工作当中,由于非产线人员出生,对NPW的知识一直一知半解,业务场景认识的不够透彻,做系统的时候很难理解甲方的NPW业务应用,特收集了不少关于NPW的一些业务场景,下面都是一些摘抄,大家关注我标红标粗的部分,

阿拉伯梳子的专栏 1586

MATLAB从入门到精通-APP调用simulink中的参数,并且修改,将结果返回到APP中

本次案例为以下微分方程: 其中方程的初始值为: Step1:搭建simulink文件,如下图所示: 初始值配置在积分模块中,如下图所示: Step2:制作app 操作视频: ,时长01:11 代码: 本文包括APP如何回调simulik中d的参数,以及把simulink中的仿真结果输出到APP中的绘图界面中。 核心代码如下: ...

wenyusuran的专栏 3042

String拼接优化为StringBuilder.append

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

郝大侠的博客 1396

PyTorch生成式人工智能(1)——神经网络与模型训练过程详解

在本节中,我们介绍了传统机器学习与人工神经网络间的差异,并了解了如何在实现前向传播之前连接网络的各个层,以计算与网络当前权重对应的损失值;实现了反向传播以优化权重达到最小化损失值的目标。并实现了网络的所有关键组成——前向传播、激活函数、损失函数、链式法则和梯度下降,从零开始构建并训练了一个简单的神经网络。

盼小辉丶的博客 1万+

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

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

change的博客 1万+

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

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

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

Lcry 1924

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

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

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

2401_83384536的博客 794

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

什么情况下用+运算符进行字符串连接比调用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、付费专栏及课程。

余额充值