1、为什么需要StringBuilder类?

因为String类型代表不可变字符串,所以无法对当前String类型实例进行处理.所以FCL提供了System.Text.StringBuilder类型,它可以接受字符串和字符作为参数,并对其进行高效动态处理,最终返回String对象.so,你可以将StringBuilder想象成对String字符串进行各种骚操作的特殊的构造器.通过Copy On Write技术实现的可变字符串的代理类,关于Copy On Wirte请参考Proxy代理模式(结构型模式)的案例二.

2、StringBuilder处理字符数组和字符串须知

(1)、StringBuilder对象实例包含一个字段,该字符引用了由Char字符构成的数组,可以用StringBuilder的各个成员来操作该字符串数组.

(2)、高效率地缩短字符串或更改字符串中的字符.

(3)、如果字符串变大,超过了事先分配的字符数组大小.StringBuilder会自动分配一个新的、更大的数组,复制字符.并开始使用新数组.前一个数组被垃圾回收.

(4)、当使用StringBuilder处理完目标字符串之后,可以调用StringBuilder的ToString方法即可将StringBuilder的处理完的数组转换成String.这样就会在堆上新建String对象.之后可以继续处理StringBuidler中的字符串.以后可再次调用ToString把它转换成另一个字符串。

常规的对字符串进行多次处理:

            string str = " Hello World";//对string进行Trim()一去字符操作//执行过程如下://1、先从字符串的开头开始处理,第一个是空格,检索传入的参数中是否有空格,有的话清除(如果第一个是连续的空字符,那么所有的空格都清除)//如果第一个被清除掉了,那么继续下一个字母H,和上面一样的流程.如果没有被清除掉,那么不在处理开头,转去清楚末尾的字母//2、当开头的字母处理完毕,接着开始处理末尾的,流程和开头的一致var res = str.Trim(' ', 'H','o');//输出:$ello World$Console.WriteLine('$'+res+'$');//可以对上一步的处理结果进行处理,但是每次处理的都不是同一个实例var res1 = res.Replace('o', 'a');Console.WriteLine(res1);//可以对上一步的处理结果进行处理,但是每次处理的都不是同一个实例var res2 = res1.PadLeft(15, '-');Console.WriteLine(res2);

虽然支持,但是每次处理的都不是同一个字符串对象实例,使用StringBuilder就能解决这个问题,保证进行多次字符串操作的同时,还能确保操作的是同一个实例.

            //设置当前StringBuilder的初始大小为1,最大长度为2.//如果设置了最大值,那么超过最大值会抛异常,如果没有设置最大值//超过初始值,长度会自动扩大两倍StringBuilder sb = new StringBuilder(15,20);sb.Append(" Hello World");sb.Replace('o', 'a');Console.WriteLine(sb.ToString());//输出完上面的处理结果之后,你可以继续对原有的StringBuilder对象进行操作.sb.AppendFormat("{0}",1);Console.WriteLine(sb.ToString());//注:所有的操作,操作的都是同一个对象,可能扩展过后的StringBuilder对象实例,会是新的对象实例

3、StringBuilder的基本知识点

(1)、StringBuilder不是基元类型,是引用类型,所以需要使用new来创建对象实例

(2)、StringBuilder类提供了6个构造器,里面的关键参数有以下几个

capacity一设置StringBuilder初始大小默认长度为16.

maxCapacity一设置StringBuider的最大容量,默认值为2147483647

value一字符串(字符串数组)

介绍一个不常用,但是有用的构造函数.

public StringBuilder(string value, int startIndex, int length, int capacity);

给定一个字符串数组,然后通过startIndex和length截取其中的一段字符串作为字符数组,实例化一个StringBuilder对象.

下面是StringBuilder常用的一些不好记的操作:

//设置当前StringBuilder的初始大小为1,最大长度为2.//如果设置了最大值,那么超过最大值会抛异常,如果没有设置最大值//超过初始值,长度会自动扩大两倍StringBuilder sb = new StringBuilder();//输出:0 这个长度是当前sb实例中字符串的长度,是字符串的实际长度
            Console.WriteLine(sb.Length);//输出:16,默认长度为16,这个长度是当前sb的总长度
            Console.WriteLine(sb.Capacity);//输出StringBuilder的最大值.默认最大值为21亿
            Console.WriteLine(sb.MaxCapacity);//通过数组的方式给sb中的字符串实例设置值,但是此时没有初始化值,所以程序报错//sb[0] = 'A';sb.Append("Hello World");//输出:HConsole.WriteLine(sb[0]);//修改sb实例的索引为0处的值为Asb[0] = 'A';//输出:Aello World
            Console.WriteLine(sb.ToString());//确保sb的长度为66,如果没有,自动扩大到66sb.EnsureCapacity(66);//输出:66
            Console.WriteLine(sb.Capacity);StringBuilder sb1 = new StringBuilder("abc");StringBuilder sb2 = new StringBuilder("abc");//输出:True  因为两个StringBuilder实例中的字符串值相等,Capacity也相等Console.WriteLine("sb1 equals sb2 is {0}", sb1.Equals(sb2));//改变Capacitysb1.EnsureCapacity(66);//输出:False 因为Capacity不同Console.WriteLine("sb1 equals sb2 is {0}", sb1.Equals(sb2));StringBuilder sb3 = new StringBuilder("Hello World");//注:目标字符串不能有值,它不能像string的copyTo方法一样去覆盖原有的值,复制过去的字符串长度也不能超过目标字符串数组的长度var destination = new char[6];sb3.CopyTo(0, destination, 0, 2);//输出:He
            Console.WriteLine(destination);//注:所有的操作,操作的都是同一个对象,可能扩展过后的StringBuilder对象实例,会是新的对象实例Console.ReadKey();

4、StringBuilder支持链式操作

因为StringBuidler的大多数方法返回一个StringBuilder引用,所以支持链式操作,代码如下:

            //设置当前StringBuilder的初始大小为1,最大长度为2.//如果设置了最大值,那么超过最大值会抛异常,如果没有设置最大值//超过初始值,长度会自动扩大两倍StringBuilder sb = new StringBuilder("Hell  World");sb.Insert(4, 'o').Replace('o', 'a').Remove(5, sb.Length - 5);Console.WriteLine("$"+ sb.ToString()+"$");

5、String类和StringBuilder类的差异

(1)、String类提供的方法多于StringBuilder类提供的方法,但是StringBuilder提供了更全面的Replace方法.所以StringBuilder无法向String类使用的那样灵活.

转载于:https://www.cnblogs.com/GreenLeaves/p/9123005.html

C# 高效率创建字符串类(StringBuilder)相关推荐

  1. Java核心类库之(常用API、字符串类、集合类、泛型)

    目录 1 常用API 1.1 Math类 1.2 System类 1.3 Object类 1.4 Objects类 1.5 Arrays类 1.6 基本类型包装类 1.6.1 Integer类概述和使 ...

  2. Java · 认识 String 类(上)· 创建字符串 · 字符串比较相等 · 字符串常量池 · 字符串不可变 · 字符字节与字符串

    目录 一.创建字符串 二.字符串比较相等 三.字符串常量池 3.1 直接赋值的内存情况 3.2 采用构造方法的内存情况 四.理解字符串不可变 五.字符.字节与字符串 5.1 字符与字符串 5.2 字节 ...

  3. [JAVA基础类库] String类 ○ StringBuffer类 ○ StringBuilder类

    引言 字符串就是一连串的字符序列,Java提供了String.StringBuffer和StringBuilder三个类来封装对字符串,并提供了系列方法来操作字符串对象. String类是不可变类的: ...

  4. callablestatement.setstring会不会将字符串trim_Java String:重要到别人只能当老二的字符串类

    字符串,是Java中最重要的类.这句肯定的推断不是Java之父詹姆斯·高斯林说的,而是沉默王二说的,因此你不必怀疑它的准确性. 关于字符串,有很多的面试题,但我总觉得理论知识绕来绕去没多大意思.你比如 ...

  5. Java String:重要到别人只能当老二的字符串类

    字符串,是Java中最重要的类.这句肯定的推断不是Java之父詹姆斯·高斯林说的,而是沉默王二说的,因此你不必怀疑它的准确性. 关于字符串,有很多的面试题,但我总觉得理论知识绕来绕去没多大意思.你比如 ...

  6. java字符串底层实现_「JAVA」细述合理创建字符串,分析字符串的底层存储,你不该错过...

    Java基础之字符串操作--String 字符串 什么是字符串?如果直接按照字面意思来理解就是多个字符连接起来组合成的字符序列.为了更好的理解以上的理论,我们先来解释下字符序列,字符序列:把多个字符按 ...

  7. android string拼接字符串_「JAVA」细述合理创建字符串,分析字符串的底层存储,你不该错过...

    Java基础之字符串操作--String 字符串 什么是字符串?如果直接按照字面意思来理解就是多个字符连接起来组合成的字符序列.为了更好的理解以上的理论,我们先来解释下字符序列,字符序列:把多个字符按 ...

  8. Java字符字符串类

    Java字符字符串类 Character 类 Character 类用于对单个字符进行操作.Character 类在对象中包装一个基本类型 char 的值在实际开发过程中,我们经常会遇到需要使用对象, ...

  9. Java常用类-StringBuilder

    Java常用类-StringBuilder StringBuilder类创建的对象其实是可变的字符串 StringBuilder的实例对象在调用append方法的时候,会对传入字符串的长度与当前剩余空 ...

最新文章

  1. Oracle客户端安装教程
  2. 让程序在崩溃时体面的退出之SEH
  3. VC/VS开发问题集锦
  4. 微信小程序插件---表单验证篇
  5. 三年级计算机教案 渔舟唱晚,《渔舟唱晚》大班教案
  6. 【openjudge 计算概论(A)】[函数递归练习(3)]
  7. 非平稳序列的随机分析
  8. pinyin4j获取汉字正确的全拼和简拼
  9. linux java 自动安装_Centos7 linux 卸载自带安装的jdk 并yum自动安装jdk1.8
  10. 什么是DNS泄漏?我为什么要关心?
  11. 【html】网页常用分享代码大全(前端必备)
  12. HTTP POST GET
  13. 线程同步作业(一):Lock,monitor
  14. 获取网页上没有下载链接的视频音频资源 火狐浏览器插件 Video DownloadHelper
  15. pythontext函数用法汇总_Python - Text Summarization
  16. 小汇总|想学机器学习吗?带坑的那种
  17. ue编辑器(UltraEdit编辑器)将制表符(Tab键)替换成其竖线分隔符(其他分隔符)乱码
  18. 在windows下编译PHP(5.4版本)
  19. 自定义注解生成代码(三) 之javapoet案例实战
  20. 解决“RIP宣告网络”问题

热门文章

  1. Mysql查询为空赋值为0
  2. CSS设置元素水平居中、垂直居中方式汇总
  3. 使用JasperReport 引擎PDF报表,因为iText版本升级,由原来的包名com.lowagie.text.pdf.fonts转化为com.itextpdf.text.pdf.fonts
  4. websocket连接出现 HTTP Authentication failed; no valid credentials available
  5. Mybatis注解的方式,如何实现MySQL ,update后,返回更新后的值
  6. ORACLE(Linux版本)实时同步数据到MYSQL(Linux版本)解决方案:OGG
  7. IBM携手MIT组建新实验室:人工智能将有像人一样的视听功能
  8. 照葫芦画瓢之老男孩购物车程序
  9. SCOM管理包模板的介绍及使用
  10. 解决问题 xcrun: error: invalid active developer path