String与StringBuilder

Java中StringBuilder 与 StringBuffer StringBuffer : 线程安全的可变字符序列 StringBuilder : 1、一个可变的字符序列 2、此类提供与StringBuffer兼容的API,继承相同的父类AbstractStringBuilder,但不保证同步|线程不安全 3、此类设计用作StringBuffer替代品,用于单个线程使用字符串缓冲区的位置(通常情况下)大量操作字符串。 4、在可能的情况下,建议使用此类优先于StringBuffer因为在大多数实现中它会更快。] 注意: 以后某些结构底层使用数组存储数据,一般 阅读详情

今天在突然想为什么在连接字符串时,StringBuffer或是StringBuilder(1.5开始)的速度要好于采用连接符“+”。有没有什么特殊的情况呢?java6对编译器对“+”操作做了优化处理后,是否也遵循上述情况呢?

在java6之前,JAVA是如何处理String间的“+”操作呢?我们知道String保存的不是真正的值,它只是栈空间中一个指向堆空间具体内容的地址,且String是final类型的类,这就意味着每次操作都会产生新的String。比如:

String str = “abc”;//“abc”保存在堆空间,str1在栈空间,保存了“abc”在堆空间的地址
	str +=  “def”;

上述操作,第一步就不需要多说了,对于第二步操作,首先在堆空间中创建新的空间,并做“abc”+“def”的操作,然后将新的堆空间地址指向str。

可见,“+”操作就是一个不断创建新对象的过程并在堆空间中复制原关联的值,这个过程会极大的延缓程序的执行效率,所以在类似的字符串不断累加的操作的,提倡使用StringBuffer和StringBuilder,同时由于StringBuffer是线程安全的,所以效率会略低于StringBuilder。

但是从JAVA6开始,上述情况发生了变化,编译器在遇到“+”操作时,会进行一定程度的优化。我们通过,编译后代码可以看到,编译器根据参与“+”操作的变量类型,而采取了优化处理。

  • 参与类型都为字符串


源代码

编译后代码

String str1 = "100" + "abc" + "zxc";

0: ldc           #2                  // String 100abczxc



  • 参与类型为字符串和基本类型


源代码

编译后代码

String str3 = "100" + 1;

55: ldc           #12                 // String 1001

String str5 = "100" + 'a'

85: ldc           #17                 // String 100a

String str6 = "100" + 100.0;

89: ldc           #18                 // String 100100.0


String str7 = "100" + true;

93: ldc           #19                 // String 100true


String str9 = true + "100";

97: ldc           #20                 // String true100


String str10 = "100" + 1 + 1.0;

101: ldc           #21                 // String 10011.0



  • 参与类型不定


源代码

编译后代码

String str2 = "100" + str1 + 1;

       3: new           #3                  // class java/lang/StringBuilder

       6: dup           

       7: invokespecial #4                  // Method java/lang/StringBuilder."<init>":()V

      10: ldc           #5                  // String 100

      12: invokevirtual #6                  // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;

      15: aload_1       

      16: invokevirtual #6                  // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;

      19: iconst_1      

      20: invokevirtual #7                  // Method java/lang/StringBuilder.append:(I)Ljava/lang/StringBuilder;

      23: invokevirtual #8                  // Method java/lang/StringBuilder.toString:()Ljava/lang/String;

String str4 = "100" + Double.valueOf(100);

      59: new           #3                  // class java/lang/StringBuilder

      62: dup           

      63: invokespecial #4                  // Method java/lang/StringBuilder."<init>":()V

      66: ldc           #5                  // String 100

      68: invokevirtual #6                  // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;

      71: ldc2_w        #13                 // double 100.0d

      74: invokestatic  #15                 // Method java/lang/Double.valueOf:(D)Ljava/lang/Double;

      77: invokevirtual #16                 // Method java/lang/StringBuilder.append:(Ljava/lang/Object;)Ljava/lang/StringBuilder;

      80: invokevirtual #10                 // Method java/lang/StringBuilder.toString:()Ljava/lang/String;

String str11 = "100" + new String("abc");

      76: new           #3                  // class java/lang/StringBuilder

      79: dup           

      80: invokespecial #4                  // Method java/lang/StringBuilder."<init>":()V

      83: ldc           #5                  // String 100

      85: invokevirtual #6                  // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;

      88: new           #19                 // class java/lang/String

      91: dup           

      92: ldc           #20                 // String abc

      94: invokespecial #21                 // Method java/lang/String."<init>":(Ljava/lang/String;)V

      97: invokevirtual #6                  // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;

     100: invokevirtual #8                  // Method java/lang/StringBuilder.toString:()Ljava/lang/String;



由上可以看到如果参与“+”运算的类型仅为字符串的时候,直接在堆空间内完成操作,不会有额外的操作了;运算类型为字符串和基本类型时,等同于全部为字符串的情况,都是在堆内完成操作;而运算类型增加了其他对象时,编译器就会首先创建一个StringBuilder对象,然后在StringBuilder对象中进行append操作,结束后再将新生成的字符串的堆地址赋值。

所以上述几种情况下,我们没有必要将“+”操作转换为StringBuffer或是StringBuilder操作了,因为编译器会为我们进行转换,转换后效率相差不会太大。但这样程序可以写的更加的简洁、直观、明了。

但是如果涉及到了循环,会是什么情况呢?


源代码

编译后代码

String str8 = "100";

for (int i = 0; i < 100; i++) {

     str8 += i;

 }

     138: ldc           #5                  // String 100

     140: astore        12

     142: iconst_0      

     143: istore        13

     145: iload         13

     147: bipush        100

     149: if_icmpge     180

     152: new           #3                  // class java/lang/StringBuilder

     155: dup           

     156: invokespecial #4                  // Method java/lang/StringBuilder."<init>":()V

     159: aload         12

     161: invokevirtual #6                  // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;

     164: iload         13

     166: invokevirtual #7                  // Method java/lang/StringBuilder.append:(I)Ljava/lang/StringBuilder;

     169: invokevirtual #8                  // Method java/lang/StringBuilder.toString:()Ljava/lang/String;

     172: astore        12

     174: iinc          13, 1

     177: goto          145


可以看到每次循环结束后,程序都会重新创建一个新的StringBuilder对象,这样同之前多次创建String对象的情况是一样的,时间浪费在了频繁的创建对象上了,所以在循环的情况下,我们还是采用StringBuilder的好。

C# String与StringBuilder 1.什么时候用String?什么时候用StringBuilder? 字符串一旦创建就不可修改大小,所以对字符串添加或删除操作比较频繁的话。那就不要用String而用StringBuilder。 例如:   String a1 = "abc";  //分配固定的内存大小             a1+="def";  //销毁原先的数据再来分配,代价比较昂贵   阅读详情

相关推荐

算法交易VWAP&TWAP

VWAP的一些算法模型细节参考博客地址http://blog.sina.com.cn/s/blog_ad47bc5b01014elx.html 日内交易量预测模型http://blog.sina.com.cn/s/blog_976461170102v43p.html 算法交易其实主要是用在基金公司、券商量化比较多。例如我已经选好股,要大量买入,但是单凭交易员的操作海量单而且要完

shulixu的博客 1万+

StringBuilder()常见方法

1.追加字符串 StringBuilder sb = new StringBuilder("x"); sb.append("a"); // 在当前字符串的尾部追加字符串a // xa sb.append("b"); // 在当前字符串的尾部追加字符串a // xab 2.替换字符串 StringBuilder sb = new StringBuilder("天王盖地虎"); sb.replace(1, 3, "博爱他"); // 替换下标1-3的位置不包含3 sb.replac

zzz11120的博客 1万+

kubernetes rook 安装 cephfs

ceph root kubernete osd uuid partuuid

天津托的博客 1543

StringBuilder()

StringBuilder (1)用法:StringBuilder对象则代表一个字符序列可变的字符串,当一个StringBuilder被创建以后,通过StringBuilder提供的append()、insert()、reverse()、setCharAt()、setLength()等方法可以改变这个字符串对象的字符序列。一旦通过StringBuffer生成了最终想要的字符串,就可以调用它的toString()方法将其转换为一个String对象。 (2):示例 //示例 StringBuilder sql

KyrieChen的博客 903

全球最大光伏电池缺陷异常检测数据集PVELAD【发布】

下载地址 1:GitHub - binyisu/PVEL-AD 下载地址 2:http://aihebut.com/col.jsp?id=118 下载地址 3:NAVEDownload 竞赛测试系统:Photovoltaic cell anomaly detection | Kaggle 一、简介 PVEL-AD 数据集又叫做EL2021数据集是用于对光伏电池异常缺陷检测方法进行基准测试的数据集,重点是光伏电池工业检测。PVEL-AD包含 36,543 张具有各种内部缺陷和异构背...

苏打水的杯子的博客 2万+

华为MetaERP Oracle EBS OM(订单管理)模块详解作为ERP财务解决方案架构师,理解OM模块的业务全景和数据模型至关重要。OM是EBS分销链路的核心引擎,贯穿“订单到收款“(Orde

Oracle EBS OM模块是管理销售订单全生命周期的核心模块,涵盖客户管理、订单执行、发运开票、定价及信用控制等功能。其标准流程包括订单录入、预订、发放、发运确认和自动开票等环节,核心数据表涉及订单、客户、发运和定价等业务对象。OM模块与库存、应收、发运等模块深度集成,架构师需重点设计订单类型、信用控制策略和自动开票接口等关键环节,确保业务流程高效流转。

金牌架构师 358

(十)Core Java String,StringBuffer (100)

 目录 :        1 ) . String(概述)2 ) . String(常见功能--获取和判断)3 ) .  String(常见功能--转换)4 ) . String(常见功能--切割和替换)5 ) . String(常见功能--比较和去除空格)6 ) .  String(字符串练习1)7 ) .  String(字符串练习2)8 ) .  String(字符串练习3)9 ).   S...

modaiairen524的博客 626

【时时三省】tessy 集成测试 总论

序论不积跬步无以至千里,不积小流无以成江海。正文。

时时三省的博客 1147

一个简单的java字节码解析

0: iconst_1 //加载一个静态常量(1)到操作数栈 1: istore_1 //将操作数栈栈顶的数值加载到局部变量表下标为(1)的位置上 2: bipush 10 //将单字节的常量值(10)推送至栈顶

lvxy_work的博客 218

【学习系列】SAP RAP 4:通过注解来完成一些常规需求

本文介绍了RAP应用中常用注解的实现方式,包括搜索帮助、文本描述绑定、联动搜索、字段控制等功能。通过@Consumption、@UI等注解可以实现搜索帮助定义、多字段联动、必输校验、默认排序和默认值设置。管理字段可通过@Semantics注解自动记录创建/修改信息,长文本使用@UI.multiLineText实现多行显示。这些注解可优化界面交互和数据管理,为后续行为定义功能开发奠定基础。文章结构清晰,针对不同需求提供了具体的实现方案和代码示例。

DeveloperMrMeng的博客 696

pymol 动画简单制作,gif、mp4导出

参考: https://www.youtube.com/watch?v=G77K9Lro8js1、直接Movie下Program下,Camera Loop下Nutate下选择,这里选择30degover4 sec;如果要动画过渡自然,可以在这4sec后面再Append 1sec;如果需要两个视角,既可以再把窗口蛋白定位到比如配体,不用管中间过程怎么定位过去配体,再Program下,Camera Loop下Nutate下选择,这里选择30degover4 sec添加;最后如果要整体形成个循环播放,可以在这4s

weixin_42357472的博客 8436

String,StringBuffer与StringBuilder的区别

一、Java String 类——String字符串常量 字符串广泛应用 在Java 编程中,在 Java 中字符串属于对象,Java 提供了 String 类来创建和操作字符串。 需要注意的是,String的值是不可变的,这就导致每次对String的操作都会生成新的String对象,这样不仅效率低下,而且大量浪费有限的内存空间。我们来看一下这张对String操作时内存变化的图: 我们可...

黎明前的准备 30万+

Vue3 - 最新实现在线预览Excel文件(xls/xlsx)多种方案,解析打开excel电子表格支持服务器链接在线URL形式、调用后端接口获取二进制文件流、文件地址(vue3实现excel预览)

vue3,预览excel文件,xlsx,xls,vue预览Excel表格,vue在线编辑xls文件,预览和编辑,vue3如何新开一页浏览器打开查看,手机h5页面打开在线EXCEL文档,在弹框中加载预览,在指定模态框中显示,基于Vue的Excel文件预览,加载失败白屏,报错没反应,详细示例代码教程,文件预览下载,nuxt3,excel预览插件,xlsx插件预览,纯前端vue中预览excel表格,接口调用的文件如何预览查看,文件url地址,vue移动端实现excel在线预览,vue移动端H5网页excel预览,

🏆 前端领域优质创作者 1万+

Stringbuilder和String的区别,一文弄清String、StringBuilder、StringBuffer

String、StringBuilder、StringBuffer对于初学者来说并不是很了解他们有什么区别,String和StringBuilder、strnigbuffer各有各的优点,希望这篇文章能够帮助初学者理解他们之间的优劣以及关系

getture的博客 1564

IEM模型,地表粗糙度模拟

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

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

关于String、StringBuffer、StringBuilder的区别

最近看到了一道题目: 正确答案:C 下面就这题的其他选项给出解析: String String不可变!先来看看String的源码: public final class String implements Serializable, Comparable<String>, CharSequence { private final byte[] value; priva...

江璇Up 4548

WINCC7.3破解文件

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

String StringBuffer StringBuilder之间的区别

在学习String、StringBuffer、StringBuilder三者时,首先给出必要的结论,后面详细分析。 在执行速度上: StringBuilder > StringBuffer > String .这是在一般情况下的结果 在安全性上: String、StringBuilder 线程非安全 || StringBuffer 线程安全 【参考文章】 https:...

奔跑的蜗牛 3288

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

String、Stringbuilder与Stringbuffer的区别,String、Stringbuilder与Stringbuffer的适用场景

没循环情况下用String的加号拼接,有循环情况下使用StringBuilder,任何场景都不推荐使用StringBuffer。

weixin_68472181的博客 1650

String与StringBuilder区别

1.概述:一个可变的字符序列,此类提供了一个与StringBuffer兼容的一套API,但是不保证同步(线程不安全,效率高)2.作用:主要是字符串拼接3.问题:a.刚讲完String,String也能做字符串拼接,直接用+即可,但是为啥还要用StringBuilder去拼接呢?b.原因:String每拼接一次,就会产生新的字符串对象,就会在堆内存中开辟新的空间,如果拼接次数多了,会占用内存,效率比较底。

qq_54100648的博客 711

StringBuilder与String的区别及StringBuilder的使用

StringBuilder与String的区别及StringBuilder的使用 1.字符串的拼接 ​ 由于String类的对象内容不可概念,所以每当进行字符串拼接时,总是会在内存中创建一个新的对象. 例如: public class StringTest{ public static void main(String[] args){ String str =...

busyingtry的博客 734

String、StringBuffer、StringBuilder 三个的区别

在Java中都是用于处理字符串的类,它们在等方面都有明显的区别。

2301_78125917的博客 2030

String、StringBuilder与StringBuffer的区别

在Java开发中,String、StringBuilder和StringBuffer是三种常用的字符串处理类,它们各有特点,适用于不同的场景。String是不可变的,每次修改都会创建新对象,适合用于字符串常量。StringBuilder是可变的,性能高,适合单线程环境下的字符串操作。StringBuffer也是可变的,但通过synchronized关键字保证了线程安全,适合多线程环境。

weixin_74120671的博客 760

StringBuilder和String的相互转换

StringBuilder ------- StringString -------StringBuilder StringBuilder ------- String public String toString(): 通过toString() 就可以把StringBuilder转换为String。 toString的使用: package com.function; public class StringBuilderTest { public static void main(String[] .

weixin_44768794的博客 1713

String,StringBuffer,StringBuilder的区别

String、StringBuffer和StringBuilder都是用于处理字符串的类,它们之间的区别如下: String:String类是不可变的,也就是说一旦创建了一个String对象,它的值就不能被修改。每次对String对象进行操作(拼接、替换等),都会创建一个新的String对象,这会产生大量的临时对象,影响性能。 StringBuffer:StringBuffer是可变的,可以对其进行修改操作。在对字符串进行频繁操作时,使用StringBuffer比直接使用String效率更高,因为Str

4万+

String和StringBuilder

3.1 StringBuilder概述 StringBuilder是一个可变的字符串类,我们可以把它看成是一个容器这里的可变指的是StringBuilder对象中的内容是可变的 String和StringBuilder的区别: String:内容是不可变的StringBuilder:内容是可变的 public static void main(String[] args) { StringBuilder s = new StringBuilder(); Syste

qq_45896330的博客 1万+
上一篇: Atomic
下一篇: 并发简介
weeweee
博客等级 码龄16年 10粉丝 44原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值