`
picluo
  • 浏览: 341101 次
  • 性别: Icon_minigender_1
  • 来自: 大力亚
社区版块
存档分类
最新评论

String,SringBuffer和 StringBuilder的区别

阅读更多

String是一个类,但却是不可变的,所以String创建的算是一个字符串常量,StringBuffer和StringBuilder都是可变的。所以每次修改String对象的值都是新建一个对象再指向这个对象。而使用StringBuffer则是对StringBuffer对象本身进行操作。所以在字符串j经常改变的情况下,使用StringBuffer要快得多。

但在某些情况下:

Java代码 复制代码
  1. String S1 = “Who” + “ is” + “ faster?”;   
  2. StringBuffer Stb = new StringBuilder(“Who”).append(“ is”).append(“ faster?”);  
String S1 = “Who” + “ is” + “ faster?”;
StringBuffer Stb = new StringBuilder(“Who”).append(“ is”).append(“ faster?”);

 S1的素对会比Stb快得多,  是因为JVM把String对象的拼接解释成了StringBuffer对象的拼接,其实在JVM就是:

Java代码 复制代码
  1. String S1="Who  is faster?";  
String S1="Who  is faster?";

 

不过如果,字符串是来自其他对象,如:

Java代码 复制代码
  1. String s1="Who";   
  2. String s2=" is";   
  3. String s3=" faster?";   
  4. String  st=s1+s2+s3;  
String s1="Who";
String s2=" is";
String s3=" faster?";
String  st=s1+s2+s3;

 

这个时候,String的速度就比不上StringBuffer了。

 

StringBuffer和StringBuilder

 

在操作字符串对象,StringBuiler是最快的,StringBuffer次之,String最慢。

Java代码 复制代码
  1. public final class StringBuffer   
  2.    extends AbstractStringBuilder   
  3.    implements java.io.Serializable, CharSequence   
  4.   
  5. ublic final class StringBuilder   
  6.    extends AbstractStringBuilder   
  7.    implements java.io.Serializable, CharSequence  
 public final class StringBuffer
    extends AbstractStringBuilder
    implements java.io.Serializable, CharSequence

public final class StringBuilder
    extends AbstractStringBuilder
    implements java.io.Serializable, CharSequence

 

可以看到StringBuffer和StringBuilder都继承继承了同一个抽象类。

 

Java.lang.StringBuffer线程安全的可变字符序列。一个类似于 String 的字符串缓冲区,但不能修改。虽然在任意时间点上它都包含某种特定的字符序列,但通过某些方法调用可以改变该序列的长度和内容。
可将字符串缓冲区安全地用于多个线程。可以在必要时对这些方法进行同步,因此任意特定实例上的所有操作就好像是以串行顺序发生的,该顺序与所涉及的每个线程进行的方法调用顺序一致。

 

 每个字符串缓冲区都有一定的容量。只要字符串缓冲区所包含的字符序列的长度没有超出此容量,就无需分配新的内部缓冲区数组。如果内部缓冲区溢出,则此容量自动增大。


StringBuffer 上的主要操作是 append 和 insert 方法,可重载这些方法,以接受任意类型的数据。每个方法都能有效地将给定的数据转换成字符串,然后将该字符串的字符追加或插入到字符串缓冲区中。append 方法始终将这些字符添加到缓冲区的末端;而 insert 方法则在指定的点添加字符。

java.lang.StringBuilder一个可变的字符序列是5.0新增的。此类提供一个与 StringBuffer 兼容的 API,但不保证同步, StringBuilder的速度比StringBuffer快。该类被设计用作 StringBuffer 的一个简易替换,用在字符串缓冲区被单个线程使用的时候(这种情况很普遍)。两者的方法基本相同。

 

如果要多次操作字符串,使用StringBuffer和StringBuilder会提高效率,但至少在数量级超过百万时,StringBuilder的速度才会体现出来。

分享到:
评论
13 楼 20029388 2009-11-05  
ferreousbox 写道
老话重弹,不过对不了解的人也是个好的学习资料,得理解语言、编译器、JVM的区别

那也不能误导人啊
12 楼 風一樣的男子 2009-11-05  
putonyuer 写道
StringBuilder 嘿嘿 , 我第一次听说  谢过


Java 5.0 开始才有的
11 楼 rovanz 2009-11-05  
诶..je啊
10 楼 lianj_lee 2009-11-05  
berlou 写道
不是自己写的就说明是转载, 但是javaeye貌似不允许转载。
话讲回来, String问题在各个java论坛上讨论过多次了。
String a = "a" + "b". 不会被JVM解释成String a = "ab"的, 相反这个是编译时的优化, 是编译器做的, 不是JVM解释时做的, JVM解释时是严格按照程序逻辑解释的.
另外, String不可变是因为它不提供修改的接口而不是因为它本身是final的, final用在类层面上是说这个类不可扩展, 而不是这个类的内容不可变化。String本身内容不能改变是因为String类没有提供对外的接口去改变char[]的值, 而不是因为final(这个你没提到, 算我的补充吧)。



lz 看看人家说的。转,也转点精华东西啊!
9 楼 ferreousbox 2009-11-05  
老话重弹,不过对不了解的人也是个好的学习资料,得理解语言、编译器、JVM的区别
8 楼 prowl 2009-11-05  
我记得String的拼接 类似 Sting a="a"+"b" jvm也会临时创建一个StringBuffer对象进行操作。
7 楼 mwmw 2009-11-05  
月×贴?~
6 楼 berlou 2009-11-05  
不是自己写的就说明是转载, 但是javaeye貌似不允许转载。
话讲回来, String问题在各个java论坛上讨论过多次了。
String a = "a" + "b". 不会被JVM解释成String a = "ab"的, 相反这个是编译时的优化, 是编译器做的, 不是JVM解释时做的, JVM解释时是严格按照程序逻辑解释的.
另外, String不可变是因为它不提供修改的接口而不是因为它本身是final的, final用在类层面上是说这个类不可扩展, 而不是这个类的内容不可变化。String本身内容不能改变是因为String类没有提供对外的接口去改变char[]的值, 而不是因为final(这个你没提到, 算我的补充吧)。


5 楼 putonyuer 2009-11-05  
StringBuilder 嘿嘿 , 我第一次听说  谢过
4 楼 prothi 2009-11-04  
总结一下就是String不可变,需要操作String相当于创建新的String,性能较低。StringBuffer和StringBuilder是可变的,区别在于StringBuffer是线程安全的,性能较StringBuilder低一点~别的没什么了
3 楼 clockmaker 2009-11-04  
berlou 写道
楼主, 别的不提, 你对String类型的理解有问题。
最好先弄清楚再发文章。
另外这个文章不像你写的?


有啥问题啊?能说一说吗?
2 楼 picluo 2009-11-04  
别卖关子了,有什么问题你说就是了,这个文章本来就不是我写!
1 楼 berlou 2009-11-04  
楼主, 别的不提, 你对String类型的理解有问题。
最好先弄清楚再发文章。
另外这个文章不像你写的?

相关推荐

    清华大学2024级化学生物学专业本科培养方案

    清华大学2024级化学生物学专业本科培养方案

    朗读程序代码.txt

    朗读程序代码

    复值晶格的复 LLL (CLLL) 晶格约简算法Matlab代码.rar

    1.版本:matlab2014/2019a/2024a 2.附赠案例数据可直接运行matlab程序。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。

    数字播放声音程序VB.NET新源代码.zip

    数字播放声音程序VB.NET新源代码

    基于蒙特卡洛法的风光场景生成与概率距离快速削减算法研究,MATLAB代码 风光场景生成 场景削减 概率距离削减法 蒙特卡洛法 MATLAB:基于概率距离快速削减法的风光场景生成与削减方法 参考文档:

    基于蒙特卡洛法的风光场景生成与概率距离快速削减算法研究,MATLAB代码 风光场景生成 场景削减 概率距离削减法 蒙特卡洛法 MATLAB:基于概率距离快速削减法的风光场景生成与削减方法 参考文档:《含风光水的电厂与配电公司协调调度模型》完全复现场景削减部分 仿真平台:MATLAB平台 代码具有一定的深度和创新性,注释清晰 主要内容:风电、光伏以及电价场景不确定性模拟,首先由一组确定性的方案,通过蒙特卡洛算法,生成50种光伏场景,为了避免大规模光伏场景造成的计算困难问题,采用基于概率距离快速削减算法的场景削减法,将场景削减至5个,运行后直接给出削减后的场景以及生成的场景,并给出相应的概率,可移植以及可应用性强。 ,MATLAB; 风光场景生成; 场景削减; 概率距离削减法; 蒙特卡洛法; 深度创新性; 注释清晰; 虚拟电厂与配电公司协调调度模型; 风电光伏电价场景不确定性模拟; 概率距离快速削减算法。,基于MATLAB的场景生成与削减技术:风光场景概率距离快速削减法研究与应用

    felix-utils-1.2.0-5.el7.x64-86.rpm.tar.gz

    1、文件内容:felix-utils-1.2.0-5.el7.rpm以及相关依赖 2、文件形式:tar.gz压缩包 3、安装指令: #Step1、解压 tar -zxvf /mnt/data/output/felix-utils-1.2.0-5.el7.tar.gz #Step2、进入解压后的目录,执行安装 sudo rpm -ivh *.rpm 4、安装指导:私信博主,全程指导安装

    基于java+ssm+mysql的视频播放系统 源码+数据库+论文(高分毕设项目).zip

    项目已获导师指导并通过的高分毕业设计项目,可作为课程设计和期末大作业,下载即用无需修改,项目完整确保可以运行。 包含:项目源码、数据库脚本、软件工具等,该项目可以作为毕设、课程设计使用,前后端代码都在里面。 该系统功能完善、界面美观、操作简单、功能齐全、管理便捷,具有很高的实际应用价值。 项目都经过严格调试,确保可以运行!可以放心下载 技术组成 语言:java 开发环境:idea 数据库:MySql8.0 部署环境:Tomcat(建议用 7.x 或者 8.x 版本),maven 数据库工具:navicat

    exchange-bmc-os-info-1.8.18-11.el7-9.x64-86.rpm.tar.gz

    1、文件内容:exchange-bmc-os-info-1.8.18-11.el7_9.rpm以及相关依赖 2、文件形式:tar.gz压缩包 3、安装指令: #Step1、解压 tar -zxvf /mnt/data/output/exchange-bmc-os-info-1.8.18-11.el7_9.tar.gz #Step2、进入解压后的目录,执行安装 sudo rpm -ivh *.rpm 4、安装指导:私信博主,全程指导安装

    基于java+ssm+mysql的花鸣B2C电子商务平台 源码+数据库+论文(高分毕设项目).zip

    项目已获导师指导并通过的高分毕业设计项目,可作为课程设计和期末大作业,下载即用无需修改,项目完整确保可以运行。 包含:项目源码、数据库脚本、软件工具等,该项目可以作为毕设、课程设计使用,前后端代码都在里面。 该系统功能完善、界面美观、操作简单、功能齐全、管理便捷,具有很高的实际应用价值。 项目都经过严格调试,确保可以运行!可以放心下载 技术组成 语言:java 开发环境:idea 数据库:MySql8.0 部署环境:Tomcat(建议用 7.x 或者 8.x 版本),maven 数据库工具:navicat

    exec-maven-plugin-javadoc-1.2.1-13.el7.x64-86.rpm.tar.gz

    1、文件内容:exec-maven-plugin-javadoc-1.2.1-13.el7.rpm以及相关依赖 2、文件形式:tar.gz压缩包 3、安装指令: #Step1、解压 tar -zxvf /mnt/data/output/exec-maven-plugin-javadoc-1.2.1-13.el7.tar.gz #Step2、进入解压后的目录,执行安装 sudo rpm -ivh *.rpm 4、安装指导:私信博主,全程指导安装

    基于java+ssm+mysql的咖啡销售系统 源码+数据库+论文(高分毕设项目).zip

    项目已获导师指导并通过的高分毕业设计项目,可作为课程设计和期末大作业,下载即用无需修改,项目完整确保可以运行。 包含:项目源码、数据库脚本、软件工具等,该项目可以作为毕设、课程设计使用,前后端代码都在里面。 该系统功能完善、界面美观、操作简单、功能齐全、管理便捷,具有很高的实际应用价值。 项目都经过严格调试,确保可以运行!可以放心下载 技术组成 语言:java 开发环境:idea 数据库:MySql8.0 部署环境:Tomcat(建议用 7.x 或者 8.x 版本),maven 数据库工具:navicat

    HarmonyOS NEXT学习资料(鸿蒙next)

    HarmonyOS NEXT学习资料(鸿蒙next)

    sssMOR 是一个 MATLAB 工具箱,用于在状态空间中对大规模动力学系统进行模型降阶Matlab代码.rar

    1.版本:matlab2014/2019a/2024a 2.附赠案例数据可直接运行matlab程序。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。

    论文写作与科技前沿等(2025.01.23) .pdf

    论文写作与科技前沿等(2025.01.23)

    farstream-0.1.2-8.el7.x64-86.rpm.tar.gz

    1、文件内容:farstream-0.1.2-8.el7.rpm以及相关依赖 2、文件形式:tar.gz压缩包 3、安装指令: #Step1、解压 tar -zxvf /mnt/data/output/farstream-0.1.2-8.el7.tar.gz #Step2、进入解压后的目录,执行安装 sudo rpm -ivh *.rpm 4、安装指导:私信博主,全程指导安装

    2025最新网络安全建设与网络社会治考试题库及答案.doc

    2025最新网络安全建设与网络社会治考试题库及答案.doc

    1小钢琴程序QZQ2024-7-30-20-45.zip

    1小钢琴程序QZQ2024-7-30-20-45

    SharpCompress.dll

    SharpCompress

    efibootmgr-17-2.el7.x64-86.rpm.tar.gz

    1、文件内容:efibootmgr-17-2.el7.rpm以及相关依赖 2、文件形式:tar.gz压缩包 3、安装指令: #Step1、解压 tar -zxvf /mnt/data/output/efibootmgr-17-2.el7.tar.gz #Step2、进入解压后的目录,执行安装 sudo rpm -ivh *.rpm 4、安装指导:私信博主,全程指导安装

    按键密码恢复程序源代码ZQ2023-11-16-11-21ZQ.zip

    按键密码恢复程序源代码ZQ2023-11-16-11-21ZQ

Global site tag (gtag.js) - Google Analytics