大家都知道StringBuilder在拼接大量字符串的时候相对String来说具有很高的效率,这是由于StringBuilder在内部处理上使用了字符串的链式存储表示法(串的块链存储法)。串的块链存储结构的C代码是这样的:

#define CHUNKSIZE 80
typedef struct Chunk
{
char ch[CHUNKSIZE];
struct Chunk* next;
}Chunk;

由此,可以看到它同时具有数组和链表的特性。我们可以类比的想象一下,把上面的代码改写成下面的C#代码:

class StringBuilder{private char[] ch;private StringBuilder next;}

其实上面的这段C#代码就是StringBuilder的一部分定义了,但StringBuilder中为了快速的获取到字符串的长度以及更方便的输出字符串,它保存了一个Offset字段,这个字段记录了所有后继结点(next)里ch的长度之和。明显头结点ch中字符的长度(非数组长度)与这个offset的和就是整个字符串的长度Length,这样显得更高效避免了遍历字符串求长度的开销。

当我们初始化StringBuilder的时候,在构造函数中允许我们传入capacity、maxcapacity以及string参数,capacity就是我们这里ch数组的长度,而maxcapacity是最大的可容下的字符串长度,也就是说Length的长度必须小于maxcapacity。随便说一句,capacity和maxcapacity的默认值分别是16和2147483647。

说了那么多原理性的东西,下面来看看一段使用StringBuilder添加字符串的代码,后面,我会使用图文来解析StringBuilder内部的工作方式。

  var strb = new StringBuilder("abcdefghijklm");//chuncksize=16,目前还有3个空闲  var input=Console.ReadLine();  strb.Append(input);

下面我们分输入的情况来讨论:

1.如果input的长度小于等于3:

当strb的内部发现当前Append的字符串长度小于strb中chunck中剩余的长度,就会直接将输入字符串添加到末尾。

2.如果input的长度大于3:

如果input的长度大于strb中ch剩余长度的时候,那么就要对strb进行“断裂”了,也就是说将input前一部分的值放到strb中去,同时将input剩下的值放到新创建的StringBuilder(也就是next)当中。

请注意strb中和strbNew中的蓝色部分,这不是巧合相等,它们确实是相等的长度,在“断裂”后,系统会重新为strb分配存储空间,这个存储空间中空闲的部分恰恰就是没有断裂前chunck中的长度。我还必须说明的一点是,在“断裂”过后,还会重新设置strb的offset,这个offset实际上就是strbNew的长度而且这个是一个循环递归的过程,在下一次strb满的时候又会执行整个这个过程。

StringBuilder的整个过程就是一个串的块链存储法的实现,它也用到了数组拷贝,但是它是通过unsafe代码来实现的,所以性能相对于托管代码要高一点。

转载于:https://www.cnblogs.com/GardeniaPeter/archive/2011/12/14/2287584.html

闲谈StringBuilder相关推荐

  1. String、StringBuffer与StringBuilder之间区别 (转载)

    最近学习到StringBuffer,心中有好些疑问,搜索了一些关于String,StringBuffer,StringBuilder的东西,现在整理一下. 关于这三个类在字符串处理中的位置不言而喻,那 ...

  2. String、StringBuffer、StringBuilder的理解

    问题: 理解 Java的字符串,String.StringBuffer.StringBuilder 有什么区别? 知识点 字符串设计和实现考量 String是Immutable(线程安全.字符串常量池 ...

  3. String、StringBuilder、StringBuffer的比较

    最近学习中又遇到了StringBuilder,突然就联想到StringBuffeer和String.于是翻翻笔记还在.那么他们有什么区别? 1.StringBuilder与StringBuffer S ...

  4. StringBuilder、StringBuffer、String区别

    相信大家对 String 和 StringBuffer 的区别也已经很了解了,但是估计还是会有很多同志对这两个类的工作原理有些不清楚的地方,今天重新把这个概念给大家复习一下,顺便牵出 J2SE5.0 ...

  5. 字符串拼接还在用StringBuilder?快试试Java8中的StringJoiner吧,真香!

    点击关注公众号,Java干货及时送达 前言 之前,我们经常会通过StringBuffer或者StingBuilder对字符串进行拼接,但是你知道Java8中推出的StringJoiner吗?它比前者更 ...

  6. 面试官问我 StringBuilder 线程不安全的点在哪儿.....

    点击关注公众号,Java干货及时送达 来源:cnblogs.com/keatsCoder/p/13212289.html 引言 面试官: StringBuilder和StringBuffer的区别在哪 ...

  7. String、StringBuffer、StringBuilder源码解析

    2019独角兽企业重金招聘Python工程师标准>>> String:如果短字符拼接的话效率是最高的,例如 String a="a"+"b"+ ...

  8. Java中String、StringBuffer和StringBuilder的区别

    转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/6581009.html  在编程中,对于字符串拼接,我们可以用String类重载的+或concat(str).S ...

  9. 测试一下StringBuffer和StringBuilder及字面常量拼接三种字符串的效率

    之前一篇里写过字符串常用类的三种方式<java中的字符串相关知识整理>,只不过这个只是分析并不知道他们之间会有多大的区别,或者所谓的StringBuffer能提升多少拼接效率呢?为此写个简 ...

最新文章

  1. 在TSQL中替换换行符
  2. 动静结合学内核:linux idle进程和init进程浅析
  3. WordPress后台的文章、分类,媒体,页面,评论,链接等所有信息中显示ID并将ID设置为第一列...
  4. 获取10~99(包含10和99)的“总和”与“偶数”的个数
  5. 如何revert一个merged branch上所有的改动
  6. 从定义到AST及其遍历方式,一文带你搞懂Antlr4
  7. 横幅新年促销海报PSD模板,拯救年底节日忙
  8. python将空格变成换行_Python基础之PEP8规范(代码写作规范)
  9. E - 权势二进制 哈尔滨理工大学软件学院大一个人赛训练
  10. Atitit attilax要工作研究的要素 纪要 方案 趋势 方向 概念 理论
  11. 【2022新版】全套Java教程-300集完整版
  12. Axure 9.0.0.3704 授权码
  13. android下载https文件,如何通过ssl(https)在android上下载文件
  14. Linux ——vi / vim 新建文件vi abc.txt 、编辑文件 i、退出编辑 esc、保存文件:wq、打开文件所在目录 open . 、使用命令打开文件 open ./abc.txt。
  15. 智能传感器芯片行业下游市场应用前景分析预测及市场需求结构分析
  16. 安全攻击溯源思路及案例
  17. torch.Tensor.requires_grad_(requires_grad=True)的使用说明
  18. 9个酒瓶子砸向Google:google不做坏事么?
  19. 木马冰河之原理篇(深入浅出看木马)
  20. 面向 C++ 的测试驱动开发

热门文章

  1. java深度克隆_Java深入学习26:Java深度克隆
  2. android ontoch事件无反应_一切从android的handler说起(三)
  3. std::list 修改某个值_在WordPress首页不显示某个分类文章的做法
  4. java 代码发送邮件添加附件_Java实现163邮箱发送邮件到QQ邮箱
  5. 女生做产品经理好吗_请做产品经理,别做功能经理
  6. 浙江师范计算机考研怎么样,浙江师范大学考研难吗?一般要什么水平才可以进入?...
  7. Elasticsearch原理与调优
  8. zookeeper教程
  9. 拿下了一个美女图片网站!
  10. 这几本书在豆瓣 8 分以上,今天中秋节包邮送!