前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >C#中String和StringBuilder的区别

C#中String和StringBuilder的区别

作者头像
zls365
发布2021-10-19 10:56:20
1.5K0
发布2021-10-19 10:56:20
举报
文章被收录于专栏:CSharp编程大全CSharp编程大全

String和StringBuilder的区别 String类型对象的特点:

1.它是引用类型,在堆上分配内存 2.运算时会产生一个新的实例 3.String 对象一旦生成不可改变(Immutable) 4.定义相等运算符(== 和 !=)是为了比较 String 对象的值(而不是引用)

String,StringBuilder类之间关系:

乍一看它们都是用于处理字符串的java类,而且长得也都差不多,相信肯定有人会以为StringBuilder都是继承自String这个类,即认为String类是其他两个类的超类。 但并非如此。

由此可以看出: StringBuilder继承自AbstractStringBuilder这个类,而AbstractStringBuilder和String都继承自Object这个类(Object是所有java类的超类)。

String是不可变类,StringBuilder是可变类。

string本身是不可改变的,它只能赋值一次,每一次内容发生改变,都会生成一个新的对象,然后原有的对象引用新的对象,而每一次生成新对象都会对系统性能产生影响,这会降低.NET编译器的工作效率。

StringBuilder类则不同,每次操作都是对自身对象进行操作,而不是生成新的对象,其所占空间会随着内容的增加而扩充,这样,在做大量的修改操作时,不会因生成大量匿名对象而影响系统性能。

二者的执行效率: 首先创建一个String对象str,并把“abc”赋值给str,然后在第三行中,其实JVM又创建了一个新的对象也名为str,然后再把原来的str的值和“de”加起来再赋值给新的str,而原来的str就会被JVM的垃圾回收机制(GC)给回收掉了,所以,str实际上并没有被更改,也就是前面说的String对象一旦创建之后就不可更改了。

代码语言:javascript
复制
public class test{
public static void main (String[] args)
{
String str="abc";
System.out.printin(str);//输出abc
str=str+"de";
System.out.printin(str);//输出abcde
}
}

而StringBuilder和StringBuffer的对象是变量,对变量进行操作就是直接对该对象进行更改,而不进行创建和回收的操作,所以速度要比String快很多。

小技巧: String:适用于少量的字符串操作,字符串不经常发生变化的时,我们可以优先使用string

string 是字符串常量

stringBuffer 是字符串变量(线程安全)

stringBuilder 是字符串变量(非线程安全)

HOW?

如果看了上面的解释有些不明白的话,那就继续往下看吧,下面的故事更精彩~

1、string

string是一个不可变的字符串,每次对string类型进行运算(赋值或拼接)的时候其实相当于重新生成了一个新的string对象,然后指针指向了新的string对象,会对系统的性能产生影响,不适合大量、频繁字符串的拼接。

代码语言:javascript
复制
string s1 = "hi~";
            string s2="I'm Elsa";
            string s = s1 + s2;
            label1.Text = s;

效果:

2、StringBuilder

stringBuilder提供 Append方法,能在已有对象的原地进行字符串的修改,一般情况下看不出和string有和差异,但是如果对大量字符串进行添加操作,stringbuilder耗费的时间比string少的多。

代码语言:javascript
复制
StringBuilder frist = new StringBuilder();
            frist.Append("select * from tableA");
            frist.Append(" as fristline");
            StringBuilder next = new StringBuilder();
            next.Append(" AND select * from tableB");
            string query = frist.Append(next).ToString();
            label1.Text = query;

除了append的方法,还有其他方法: StringBuilder.Append 将信息追加到当前 StringBuilder 的结尾。 StringBuilder.AppendFormat 用带格式文本替换字符串中传递的格式说明符。 StringBuilder.Insert 将字符串或对象插入到当前 StringBuilder 对象的指定索引处。 StringBuilder.Remove 从当前 StringBuilder 对象中移除指定数量的字符。 StringBuilder.Replace 替换指定索引处的指定字符。

其实还有一个stringBuffer,可将字符串缓冲区安全的用于多个线程,可以在必要时同步,所以操作就像是以串行顺序发生,该顺序与所涉及到的每个线程进行的方法调用一致。

他们三者的优先使用顺序:stringBuilder(快)>stringBuffer>string

总结一下

1、string继承object类,stringbuilder继承AbstractStringBuilder。 2、string是不可变类,stringbuilder是可变类。 3、stringstringbuilder运行速度比string快。

其实还有一个stringBuffer,可将字符串缓冲区安全的用于多个线程,可以在必要时同步,所以操作就像是以串行顺序发生,该顺序与所涉及到的每个线程进行的方法调用一致。

他们三者的优先使用顺序:stringBuilder(快)>stringBuffer>string

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2021-06-20,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 CSharp编程大全 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 总结一下
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档