stringbuilder(stringbuilder如何清空)

http://www.itjxue.com  2023-01-28 16:15  来源:未知  点击次数: 

C#中string和StringBuilder的区别

//最大的区别体现在字符串拼接的时候

string str1="hello ";

string str2="world";

str1 += str2;

//此时内存中存在三个对象分别为str1("hello world"), str2("hello"),以及一个没有任何引用的垃圾

//对象"hello"(该对象,最终会被GC收集,清理)

StringBuilder sb=new StringBuilder();

sb.Append("hello ");

sb.Append("world");

//此时内存中只有sb("hello world")一个对象

//所以在做大规模的字符串拼接的时候(比较常见的是ADO.NET中查询语句的拼接),推荐使用

//StringBuilder而不是string,因为用string的话,你的内存将会十分可怕,不要太过依赖GC,因为GC

//并不是实时的,不是说C#程序员就可以完全不管内存,能控制的还是要尽量控制.

为什么说StringBuilder是线程不安全的?

String:不可变字符串;

StringBuffer:可变字符串、效率低、线程安全;

StringBuilder:可变字符序列、效率高、线程不安全;

总结:

(1)如果要操作少量的数据用 String;

(2)多线程操作字符串缓冲区下操作大量数据 StringBuffer;

(3)单线程操作字符串缓冲区下操作大量数据 StringBuilder(推荐使用)。

// 存储的字符串(通常情况一部分为字符串内容,一部分为默认值)

char[] value;

// 数组已经使用数量

int count;

上面的这两个属性均位于它的抽象父类AbstractStringBuilder中。

如果查看构造方法我们会发现,在创建StringBuilder时会设置数组value的初始化长度。

public StringBuilder(String str) {

super(str.length() + 16);

append(str);

}

默认是传入字符串长度加16。这就是count存在的意义,因为数组中的一部分内容为默认值。

当调用append方法时会对count进行增加,增加值便是append的字符串的长度,具体实现也在抽象父类中。

public AbstractStringBuilder append(String str) {

if (str == null)

return appendNull();

int len = str.length();

ensureCapacityInternal(count + len);

str.getChars(0, len, value, count);

count += len;

return this;

}

我们所说的线程不安全的发生点便是在append方法中count的“+=”操作。我们知道该操作是线程不安全的,那么便会发生两个线程同时读取到count值为5,执行加1操作之后,都变成6,而不是预期的7。这种情况一旦发生便不会出现预期的结果。所以说StringBuilder是线程不安全的。

String 与StringBuilder有什么区别

两者的区别:

1. string 对象时恒定不变的,stringBuider对象表示的字符串是可变的。stringBuilder是.net提供的动态创建string的高效方式,以克服string对象恒定性带来的性能影响。

2. 对于简单的字符串连接操作,在性能上stringBuilder并不一定总是优于string。因为stringBuider对象创建代价较大,在字符串目标连接较少的情况下,过度滥用stringBuilder会导致性能的浪费,只有大量的或者无法预知次数的字符串操作,才考虑stringBuilder来实现。事实上,一般连接次数设置100次以内,根本看不出两者的性能差别。

3. 当修改字符串信息时,此时不许创建对象,可以使用stringBuilder对象。

String 对象是不可改变的。每次使用 System.String 类中的方法之一时,都要在内存中创建一个新的字符串对象,这就需要为该新对象分配新的空间。

例如: ? string a="a";a+="b";,每次在后面追加都会重新申请一个能放字符串的内存空间;

string Interning(字符串驻留)指的是通过维护一张表来存放字符串。CLR内部维护了一个哈希表(Hash Table)来管理其创建的大部分string对象,其中key为string本身,而value为分配给对应string的内存地址。

public static string Intern(string str);

public static string IsInterned(string str);

两者的处理机制都是在哈希表中查找是否存在str参数字符串,如果找到就返回已存在的string对象的引用,没有找到,Intern方法将该str字符串添加到哈希表,并返回引用;而IsInterned方法则不会向哈希表中添加字符串,而是返回null;

StringBuilder 对象是动态对象,允许扩充它所封装的字符串中字符的数量,但是您可以为它可容纳的最大字符数指定一个值,当修改 StringBuilder 时,在达到容量之前,它不会为其自己重新分配空间。当达到容量时,将自动分配新的空间且容量翻倍。可以使用重载的构造函数之一来指定 StringBuilder 类的容量。

例如:?StringBuilder sb = new StringBuilder(); sb.Append("a")他不会频繁申请内存空间,他会自动向后扩展。

扩展资料:

C++、java、VB等编程语言中的字符串。 在java、C#中,String类是不可变的,对String类的任何改变,都是返回一个新的String类对象。 String 对象是?System.Char?对象的有序集合,用于表示字符串。String 对象的值是该有序集合的内容,并且该值是不可变的。

StringBuilder是一个可变的字符序列。此类提供一个与 StringBuffer 兼容的 API,但不保证同步。该类被设计用作 StringBuffer 的一个简易替换,用在字符串缓冲区被单个线程使用的时候(这种情况很普遍)。

参考资料:string_百度百科,StringBuilder_百度百科

stringbuilder和stringbuffer的区别

string和stringbuffer和stringbuilder的区别如下:

1、线程安全:StringBuffer:线程安全,StringBuilder:线程不安全。因为StringBuffer的所有公开方法都是synchronized修饰的,StringBuilder并没有StringBuilder修饰。

2、缓冲区:StringBuffer每次获取toString都会直接使用缓存区的toStringCache值来构造一个字符串。而StringBuilder则每次都需要复制一次字符数组,再构造一个字符串。所以,缓存冲这也是对StringBuffer的一个优化吧,不过StringBuffer的这个toString方法仍然是同步的。

3、性能:StringBuffer是线程安全的,它所有公开方法都是同步的,StringBuilder是没有对方法加锁同步的,所以毫无疑问,StringBuilder的性能要远大于StringBuffer。

字符修改上的区别:

①String。

String?s = null。

String?s =“abc”。

②StringBuffer。

StringBuffer s = null; //结果警告:Null pointer access: The variable result can only be null at this location。

StringBuffer s = new StringBuffer();//StringBuffer对象是一个空的对象。

StringBuffer s = new StringBuffer(“abc”);//创建带有内容的StringBuffer对象,对象的内容就是字符串”。

String,StringBuffer和StringBuilder之间的区别

1、三者在执行速度方面的比较:StringBuilder StringBuffer ? ?String

String (StringBuffer,StringBuilder)的原因

String:字符串常量

StringBuffer:字符串变量

StringBuilder:字符串变量

从上面的名字可以看到,String是“字符创常量”,也就是不可改变的对象。

2、StringBuffer/StringBuilder是生产这个商品的流水线,StringBuffer速度慢,但(线程)安全性高,StringBuilder速度快,但(线程)安全性差。

3、 ?String?类是final,引用内存中的值不可变。引用数据量一大就不效率,StringBuffer?是用于频繁修改的,而且是线程安全,StringBuilder 是线程不安全。如果只是用来声明一个变量的话就用String,如果用于字符串之间的频繁操作的话就用StringBuffer。

4、如果少量的字符串操作采用String,如果单线程下操作大量字符串采用StringBuilder ,如果多线程下操作大量字符串采用StringBuffer 。

5、StringBuffer、StringBuilder和String一样,也用来代表字符串。String类是不可变类,任何对String的改变都会引发新的String对象的生成;StringBuffer则是可变类,任何对它所指代的字符串的改变都不会产生新的对象。

6、StringBuffer和StringBuilder类的区别也是如此,他们的原理和操作基本相同,区别在于StringBufferd支持并发操作,线性安全的,适合多线程中使用。StringBuilder不支持并发操作,线性不安全的,不适合多线程中使用。新引入的StringBuilder类不是线程安全的,但其在单线程中的性能比StringBuffer高。

string和stringbuffer和stringbuilder的区别

string和stringbuffer和stringbuilder的区别:1、可变与不可变2、初始化方式3、字符串修改方式4、是否实现了equals方法5、是否实现了hashCode方法

1、可变与不可变

String类是一个不可变类,即创建String对象后,该对象中的字符串是不可改变的,直到这个对象被销毁。StringBuffer与StringBuilder都继承自AbstractStringBuilder类,在AbstractStringBuilder中也是使用字符数组保存字符串,是可变类。

2、初始化方式

当创建String对象时,可以利用构造方法String str = new String("Java")的方式来对其进行初始化,也可以直接用赋值的方式String s = "Java"来初始化。

3、字符串修改方式

String字符串修改方法是首先创建一个StringBuffer,其次调用StringBuffer的append方法,最后调用StringBuffer的toString()方法把结果返回

4、是否实现了equals方法

String实现了equals()方法和hashCode()方法,new String("java").equals(new String("java"))的结果为true;

5、是否实现了hashCode方法

而StringBuffer没有实现equals()方法和hashCode()方法,

(责任编辑:IT教学网)

更多

推荐Flash动画文章