String,StringBuffer与StringBuilder的区别??

String,StringBuffer与StringBuilder的区别??String字符串常量StringBuffer字符串变量(线程安全)StringBuilder字符串变量(非线程安全) 简要的说,String类型和StringBuffer类型的主要性能区别其实在于String是不可变的对象,因此在每次对String类型进行改变的时候其实都等同于生成了一个新的String对象,然后将指针指向新的String对象,所以经常改变内容的字

大家好,又见面了,我是你们的朋友全栈君。

String 字符串常量
StringBuffer 字符串变量(线程安全)
StringBuilder 字符串变量(非线程安全)

 简要的说, String 类型和 StringBuffer 类型的主要性能区别其实在于 String 是不可变的对象, 因此在每次对 String 类型进行改变的时候其实都等同于生成了一个新的 String 对象,然后将指针指向新的 String 对象,所以经常改变内容的字符串最好不要用 String ,因为每次生成对象都会对系统性能产生影响,特别当内存中无引用对象多了以后, JVM 的 GC 就会开始工作,那速度是一定会相当慢的。
 而如果是使用 StringBuffer 类则结果就不一样了,每次结果都会对 StringBuffer 对象本身进行操作,而不是生成新的对象,再改变对象引用。所以在一般情况下我们推荐使用 StringBuffer ,特别是字符串对象经常改变的情况下。而在某些特别情况下, String 对象的字符串拼接其实是被 JVM 解释成了 StringBuffer 对象的拼接,所以这些时候 String 对象的速度并不会比 StringBuffer 对象慢,而特别是以下的字符串对象生成中, String 效率是远要比 StringBuffer 快的:
 String S1 = “This is only a” + “ simple” + “ test”;
 StringBuffer Sb = new StringBuilder(“This is only a”).append(“ simple”).append(“ test”);
 你会很惊讶的发现,生成 String S1 对象的速度简直太快了,而这个时候 StringBuffer 居然速度上根本一点都不占优势。其实这是 JVM 的一个把戏,在 JVM 眼里,这个
 String S1 = “This is only a” + “ simple” + “test”; 其实就是:
 String S1 = “This is only a simple test”; 所以当然不需要太多的时间了。但大家这里要注意的是,如果你的字符串是来自另外的 String 对象的话,速度就没那么快了,譬如:
String S2 = “This is only a”;
String S3 = “ simple”;
String S4 = “ test”;
String S1 = S2 +S3 + S4;
这时候 JVM 会规规矩矩的按照原来的方式去做


在大部分情况下 StringBuffer > String
StringBuffer
Java.lang.StringBuffer线程安全的可变字符序列。一个类似于 String 的字符串缓冲区,但不能修改。虽然在任意时间点上它都包含某种特定的字符序列,但通过某些方法调用可以改变该序列的长度和内容。
可将字符串缓冲区安全地用于多个线程。可以在必要时对这些方法进行同步,因此任意特定实例上的所有操作就好像是以串行顺序发生的,该顺序与所涉及的每个线程进行的方法调用顺序一致。
StringBuffer 上的主要操作是 append 和 insert 方法,可重载这些方法,以接受任意类型的数据。每个方法都能有效地将给定的数据转换成字符串,然后将该字符串的字符追加或插入到字符串缓冲区中。append 方法始终将这些字符添加到缓冲区的末端;而 insert 方法则在指定的点添加字符。
例如,如果 z 引用一个当前内容是“start”的字符串缓冲区对象,则此方法调用 z.append(“le”) 会使字符串缓冲区包含“startle”,而 z.insert(4, “le”) 将更改字符串缓冲区,使之包含“starlet”。
在大部分情况下 StringBuilder > StringBuffer
java.lang.StringBuilde
java.lang.StringBuilder一个可变的字符序列是5.0新增的。此类提供一个与 StringBuffer 兼容的 API,但不保证同步。该类被设计用作 StringBuffer 的一个简易替换,用在字符串缓冲区被单个线程使用的时候(这种情况很普遍)。如果可能,建议优先采用该类,因为在大多数实现中,它比 StringBuffer 要快。两者的方法基本相同。
 
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/153412.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • C3P0连接池的配置与使用[通俗易懂]

    C3P0连接池的配置与使用[通俗易懂]1、下载c3p0-0.9.1.2.jar下载地址:http://download.csdn.net/detail/chunxiaqiudong5/96619222、添加配置文件c3p0-config.xml3、配置文件内容如下:1030100

    2022年6月1日
    25
  • 关于去掉Li标签前面的小圆点和距离/显示下划线

    关于去掉Li标签前面的小圆点和距离/显示下划线解决方法去掉 Li 标签前面的距离 nbsp nbsp 设置 ul nbsp nbsp padding 0px 去掉 Li 标签前面的小圆点 设置 li nbsp nbsp nbsp list style type none 显示下划线 nbsp nbsp nbsp text decoration underline

    2025年7月24日
    5
  • java 二维数组 arraycopy_Java对数组的复制[通俗易懂]

    java 二维数组 arraycopy_Java对数组的复制[通俗易懂]定义一个数组int[]a={3,1,4,2,5};int[]b=a;数组b只是对数组a的又一个引用,即浅拷贝。如果改变数组b中元素的值,其实是改变了数组a的元素的值,要实现深度复制,可以用clone或者System.arrayCopyint[]a={3,1,4,2,5};int[]b=a.clone();b[0]=10;System.out.println(b[0]+””+a[0…

    2022年7月7日
    46
  • 使用DbUtils实现CRUD

    使用DbUtils实现CRUD

    2022年1月2日
    44
  • idea插件开发指南_idea get set插件

    idea插件开发指南_idea get set插件gitee地址:https://gitee.com/jyq_18792721831/studyplugin.gitidea插件开发入门idea插件开发–配置idea插件开发–服务-翻译插件idea插件开发–组件–编程久坐提醒介绍组件应用程序启动项目打开模块打开应用程序/项目关闭监听程序代码中注册监听器声明注册监听器项目级的监听器声明注册的其他配置自定义监听器接口消息系统设计主题消息总线连接广播嵌套消息组件定义应用程序级别项目级别监听器定义Java计时器实例需求分解项目创建配置界面存储服务配置和

    2022年10月1日
    2
  • 51单片机C语言延时函数怎么定义和使用

    51单片机C语言延时函数怎么定义和使用C语言定义延时函数主要通过无意义指令的执行来达到延时的目的。C程序中可使用不同类型的变量来进行延时设计。经实验测试,使用unsignedchar类型具有比unsignedint更优化的代码,在使用时应该使用unsignedchar作为延时变量。

    2022年6月15日
    39

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号