string,StringBuffer与StringBuilder的区别

2023-05-16

 
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 要快。两者的方法基本相同。
Stringbuilder类是直接用于字符串操作的类,打个比方把
(1)string aa="123456";
(2)aa+="789";
搜索
(3)StringBuilder text=new StringBuilder("123456",12);
(4)text.Append("789");
如果你输出aa,和text 你会发现他们的输出内容是一样的。
但是aa的操作过程实际上是:首先在内存中分配一个地址空间,空间大小是6。
然后执行  aa+="789";的操作,该过程是连接字符串,“123456”和“789”并且在内存中重新分配地址。把aa 的内存地址指向 “123456789”的内存地址。

也就是说在内存中实际上是有两个空间北分配,第一的内存空间,在后来是由C#的垃圾处理机制来自动处理掉,

如果我们用3 4 句的程序来实现这个过程,那么他是没有再次分配内存空间的,
他就是在text的内存空间里进行了操作。这里要说明下StringBuilder在生命变量的过程中是可以我们自己来分配他的大小的,如果实际的内容超出内存空间,
他会自动翻倍。

通过上面的例子,我们可以知道 StringBuilder的优越性是在:
第一:他不需要每次都去分配内存空间。所以系统就没有必要去处理垃圾;
第二:当我们需要多次的对一个字符串进行多次操作的时候,他的效率要远远  高  与string
string类具有恒常性,即当a="345";当要修改a,比如要再增加a的长度或修改a的值时,a原来指向“345”,此时修改后,a重新指向新的字符串,而非指向原来“345”的位置。
而stringbulider则可以对源字符串进行修改,修改后,指向的是原来对象的位置。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

string,StringBuffer与StringBuilder的区别 的相关文章

随机推荐

  • C# 截取字符串

    本文章已收录于 xff1a str为要进行截取的字符串 start是第一个关键字 字符串 last是第二个关键字 字符串 public string GetContent string str string start string las
  • C#中文件及文件夾的遍历

    操作文件常用的类有 xff1a File 实用类 xff0c 提供许多静态方法 xff0c 用于移动 删除 和复制文件 Directory 实用类 xff0c 提供许多静态方法 xff0c 用于移动 删除和复制目录 Path 实用类 xff
  • C# 简单的XML读取修改写入

    XML概念 Root XML根节点 xff0c 只能且必须有一个 以上为LinkLibrary Element 节点元素 如Link Attribute 节点属性 如Cat Url Desc Content 内容 xff08 非空白文本 C
  • C# XML 添加,修改,删除Xml节点

    添加xml节点 private void AddXml string image string title XmlDocument xmlDoc 61 new XmlDocument xmlDoc Load Server MapPath 3
  • 使用Activator.CreateInstance完善简单工厂

    前几天在项目中看到别人的工厂类使用Activator CreateInstance 之前用简单工厂都是用switch case xff0c 之前没有用过便查了查资料 xff0c 正是这个方法 43 反射简化了工厂模式 xff0c 在需求增加
  • can协议的数据帧格式

    1 帧起始和帧结束 2 仲裁段 xff1a 3 控制段 xff1a 4 数据段 5 CRC段 6 ACK段
  • C#各种配置文件使用,操作方法总结

    配置文件操作 配置文件一般分为内置配置文和用户自定义配置文件 内置配置文件包括app config web config Settings settings等等 用户自定义配置文件一般是将配置信息放到XML文件或注册表中 xff0c 配置信
  • C#中配置文件的使用

    1 向项目添加app config文件 xff1a 右击项目名称 xff0c 选择 添加 添加新建项 xff0c 在出现的 添加新项 对话框中 xff0c 选择 添加应用程序配置文件 xff1b 如果项目以前没有配置文件 xff0c 则默认
  • C# 获取主机IP地址

    public static string GetIP string strAddr 61 34 34 try string strHostName 61 System Net Dns GetHostName System Net IPHos
  • C#中的继承与多态还有接口

    简单继承多态接口参考 简单继承 最简单的三个类 csharp view plain copy print public class Animal public Animal Debug Log 34 Construct Animal 34
  • C#操作配置文件中appSettings,connectionStrings节点

    using System using System Configuration using System Web using System Web Configuration namespace myConfiguration region
  • C# 配置文件读取与修改

    目录 43 旧方法 各位看官最好使用下面新方法新方法 配置文件在很多情况下都使用到 配置文件分为两种 一种是应用程序的配置文件 一种是web的配置文件 两种配置文件最大的区别是web的配置文件更新之后会实时更新 应用程序的配置文件不会实时更
  • AppSettings和ConnectionStrings的区别

    ConfigurationSettings AppSettings 34 34 和 ConfigurationManager ConnectionStrings 34 34 ConnectionStrings有什么区别 xff1f 晕呀 更
  • appsetting 和connectionString 的区别。

    AppSettings是ASP NET1 1时期用的 在 NET Framework 2 0中 xff0c 新增了ConnectionStrings 1 lt connectionStrings gt lt connectionString
  • 配置文件的方式总结

    1 xml文件存储配置信息 xff0c 属性中可设置输出到应用程序输出路径拷贝 xff0c 程序中读写使用 xff0c 程序修改只需修改xml文件然后覆盖到输出路径中 2 AppConfig文件存储 xff0c 可设置属性输出路径 xff0
  • 计算机大端模式和小端模式 内存对齐问题(sizeof)

    目录 43 一大端模式和小端模式的起源二什么是大端和小端三数组在大端小端情况下的存储四为什么会有大小端模式之分呢五如何判断机器的字节序内存对齐问题 再讲讲pragma pack 内存对齐二 一 大端模式和小端模式的起源 关于大端小端名词的由
  • linux虚拟机关机、重启命令

    一 shutdown 1 shutdown h now xff1a 立即关机 2 shutdown h 10 53 xff1a 到10 53关机 3 shutdown h 43 10 xff1a 10分钟后自动关机 4 shutdown r
  • C#函数的重载

    函数名必须相同方能构成函数重载 函数返回值类型 可以相同 也可以不同 注意 函数的返回类型不足以区分两个重载函数 函数参数类型 必须不同 函数参数个数 可以相同 可以不同 函数参数顺序 可以相同 可以不同 csharp view plain
  • 静态方法和实例化方法的本质区别

    本文章已收录于 xff1a 这是一个经常被时时提出来的问题 xff0c 很多时候我们以为理解了 懂了 xff0c 但深究一下 xff0c 我们却发现并不懂 方法是我们每天都在写得 xff0c 很多程序员大多都使用实例化方法 xff0c 而很
  • string,StringBuffer与StringBuilder的区别

    String 字符串常量 StringBuffer 字符串变量 xff08 线程安全 xff09 StringBuilder 字符串变量 xff08 非线程安全 xff09 简要的说 xff0c String 类型和 StringBuffe