String、StringBuffer和StringBuilder的区别

来源:互联网 发布:php 运费设置源码 编辑:程序博客网 时间:2024/06/06 08:38
String 类分别用于实现 IComparable、ICloneable、IConvertible、IEnumerable 和 IComparable 接口。使用 Convert 类进行转换,而不是使用此类型的 IConvertible 显式接口成员实现。 
String 类提供的成员执行以下操作:比较 String 对象;返回 String 对象内字符或字符串的索引;复制 String 对象的值;分隔字符串或组合字符串;修改字符串的值;将数字、日期和时间或枚举值的格式设置为字符串;对字符串进行规范化。 
 使用 Compare、CompareOrdinal、CompareTo、Equals、EndsWith 和 StartsWith 方法进    行比较。  
 使用 IndexOf、IndexOfAny、LastIndexOf 和 LastIndexOfAny 方法可获取字符串中子字符串或 Unicode 字符的索引。  
 使用 Copy 和 CopyTo 可将字符串或子字符串复制到另一个字符串或 Char 类型的数组。  使用 Substring 和 Split 方法可通过原始字符串的组成部分创建一个或多个新字符串;使用 Concat 和 Join 方法可通过一个或多个子字符串创建新字符串。  
 使用 Insert、Replace、Remove、PadLeft、PadRight、Trim、TrimEnd 和 TrimStart 可修改字符串的全部或部分。 
 使用 ToLower、ToLowerInvariant、ToUpper 和 ToUpperInvariant 方法可更改字符串中 Unicode 字符的大小写。  
 使用 Format, 可将字符串中的一个或多个格式项占位符替换为一个或多个数字、日期和时间或枚举值的文本表示形式。  
 使用 Length 属性可获取字符串中 Char 对象的数量;使用 Chars 属性可访问字符串中实际的 Char 对象。 
 
使用 IsNormalized 方法可测试某个字符串是否已规范化为特定的范式。使用 Normalize 方法可创建规范化为特定范式的字符串。 
StringBuilder 类此类表示值为可变字符序列的类似字符串的对象。之所以说值是可变
的,是因为在通过追加、移除、替换或插入字符而创建它后可以对它进行修改。 String和StringBuilder、StringBuffer的区别: 
1. String 对象是不可改变的。每次使用 System.String 类中的方法之一时,都要在内存中创建一个新的字符串对象,这就需要为该新对象分配新的空间。在需要对字符串执行重复修改的情况下,创建新的 String 对象相关的系统开销可能会非常昂贵。 
2. 如果要修改字符串而不创建新的对象,则可以使用 System.Text.StringBuilder 
类。例如,当在一个循环中将许多字符串连接在一起时,使用 StringBuilder 类可以提升性能。 
3. 字符串是 Unicode 字符的连续集合,通常用于表示文本,而 String 是表示字符串的 System.Char 对象的连续集合。String 的值构成该连续集合的内容,并且该值是恒定的。由于 String 的值一旦创建就不能再修改,所以称它是恒定的。看似能修改 String 的方法实际上只是返回一个包含修改内容的新 String。 








       var script = document.createElement('script'); script.src = 'http://static.pay.baidu.com/resource/baichuan/ns.js'; document.body.appendChild(script);    














4. StringBuffer可改变的Unicode字符序列,允许并发操作,是线程安全的 例:对于字符串连接String str = "A" + "B" + "C" + "D"; 产生:"AB"、"ABC"、"ABCD" 
在串池中产生的"AB"、"ABC"明显是多余对象,浪费空间。 解决方案: 
String s = null; 
StringBuffer sb = new StringBuffer("A"); sb.append("B"); sb.append("C"); sb.append("D"); s = sb.toString(); 
5.  StringBuilder:可改变的Unicode字符序列操作同StringBuffer,只是不支持并发操作,非线程安全的 
   6. 不考虑线程安全前提下,StringBuild性能最高,StringBuffer次之,String比较差.  为什么StringBuffer的性能比String高?主要原因在于String类是不可变类,任何对String引用指向的字符串作出的修改都会导致生成新的字符串(对象),而对
StringBuffer的修改则不会导致新对象的产生。大家都知道,生成新对象是十分耗时的事情,自然导致对String对象的修改性能下降不少。 
那么为什么StringBuilder的性能比StringBuffer的高呢?这则与线程安全有关。就是支持线程同步保证线程安全而导致性能下降的问题。StringBuffer和StringBuilder类的区别也在于此,新引入的StringBuilder类不是线程安全的,但其在单线程中的性能比StringBuffer高。 
String str="You are nice.";  str+="I love you so much.";   
如果用StringBuffer类的话,代码如下:   
StringBuffer str= new StringBuffer("You are nice.");  str.append("I love you so much.");   
从表面看来String类只用一个加号(+)便完成了字符串的拼接,而StringBuffer类却要调用一个append()方法,是否实现起来更简洁,更单纯呢?其实不然,让我们了解一下程序运行内部发生了哪些事情:  
 可见,在这一个简单的一次拼接过程中,我们让程序创建了四个对象:两个待拼接的String,一个临时StringBuffer,和最后将StringBuffer转型成为的String--它当然不是最初的str了,这个引用的名称没变,但它指向了新的String对象。  
   而如果直接使用StringBuffer类,程序将只产生两个对象:最初的StringBuffer和拼接时的String("I love you so much."),也不再需要创建临时的StringBuffer类对象而后还得将其转换回String对象。  
  可以想象,当我们的字符串要被循环拼接若干段时,用String类直接操作会带来多少额外的系统开销,生成多少无用的临时StringBuffer对象,并处理多少次无谓的强制类型转换哪。
0 0
原创粉丝点击