stringbuilder在循环里拼接,stringbuilder遍历

http://www.itjxue.com  2023-01-05 12:35  来源:未知  点击次数: 

为什么js拼接字符串StringBuilder效率那么高

大家都知道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内部的工作方式。

//chuncksize=16,目前还有3个空闲

var strb = new StringBuilder("abcdefghijklm");

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代码来实现的,所以性能相对于托管代码要高一点。

字符串拼接string+string和stringBuilder效率问题

StringBuilder类是在J2SE5.0版本上才提出来的新功能。为此如果要采用这个类的话,那么所采用的J2SE版本必须要高于5.0。否则的话,运行相关作业时就可能会产生问题。

stringBuilder效率高,不产生新的对象。。条件允许的话,stringBuilder是可以代替string的。。

string对象操作的时候,总是产生新的对象,然后自动回收旧的对象(如果没用的话),效率是比stringBuilder在原对象上进行操作来的低的。。我不知道你说的“字符串拼接的时候最好不用stringBuilder”是在哪看到的哦。。

字符串拼接的五种方式

? 虽然字符串是不可变的,但是还是可以通过新建字符串的方式来进行字符串的拼接。

常用的字符串拼接方式有五种,分别是使用+、使用 concat、使用 StringBuilder、使

用 StringBuffer 以及使用 StringUtils.join。具体的使用方式:

StringUtils.join用于集合循环拼接,具体参照源码:

强调一下,如果不是在循环体中进行字符串拼接的话,直接使用+就好了。如果在并发场景中进行字符串拼接的话,要使用 StringBuffer 来代替StringBuilder。

部分图片观点参考自:?

Java成神之路? ? ? 阿里云开发社区? ? Hollis? ?

如何遍历stringbuilder

方法一:拼接过程中自动处理逗号

public static void main(String[] args) {

StringBuilder str=new StringBuilder();

ListString list=new ArrayListString();

list.add("你");

list.add("好");

for(int i=0;ilist.size();i++)

{

if(i==list.size()-1)//当循环到最后一个的时候 就不添加逗号,

{

str.append(list.get(i));

}

else {

str.append(list.get(i));

str.append(",");

}

}

System.out.println(str);

}

方法二:通过StringBulide类手动去除最后一个逗号

public static void main(String[] args) {

StringBuilder str=new StringBuilder();

for (int i = 0; i 4; i++) {

str.append(i+"1,");

}

String ss=str.substring(0,str.length()-1);//当循环结束后截取最后一个逗号

System.out.println(ss);

string与StringBuilder拼接字符串的性能差距有多大

之前也看过一些对string与StringBuilder的性能分析,总感觉这个应该对整体性能不会产生多大的影响,所以就一直没有关注这块!

由于学程序初期最先接触的string拼接,所以就一直没改变过自己的习惯!

前段时间抽时间写了一个CMS系统,一开始的时候每秒钟大概能生成200条新闻,可是后来由于新闻系统与购物系统整合后,发现生成速度突然就掉下来了

最快的时候每秒钟也就生成130多条新闻,按照正常的情况下不应该会出现这个问题的,于是从后期整合的代码里面找原因,

由于生成新闻的时候,我们都要提取相关商品的相关信息并输出,而且这些都是用string进行拼接的,由于拼接的次数比较频繁,

突然就想到了这个string与StringBuilder的性能的问题,于是我粗略的做了一个小小的测试!

用StringBuilder循环的拼接10000次字符串需要的时间为 0到1毫秒!

代码如下:

long tt = long.Parse(DateTime.Now.ToString("yyyyMMddHHmmssfff"));

StringBuilder start = new StringBuilder();

for(int j=0;j10000;j++)

{

start.Append("测试测试测试测试测试测试测试测试测试测试测试测试");

}

long mm = long.Parse(DateTime.Now.ToString("yyyyMMddHHmmssfff"));

Response.Write(Convert.ToString( mm-tt));

用string循环的拼接100000次字符串需要的时间为 5500到6000毫秒!

代码如下:

long tt = long.Parse(DateTime.Now.ToString("yyyyMMddHHmmssfff"));

string start =string.Empty;

for(int j=0;j10000;j++)

{

start += "测试";

}

long mm = long.Parse(DateTime.Now.ToString("yyyyMMddHHmmssfff"));

Response.Write(Convert.ToString( mm-tt));

我原本用的是100000 次拼接做的测试,StringBuilder仅用了30毫秒,但是用string拼接就执行几分钟没有执行完,所以我就改用10000次来做试验了!

简单的可以概括为,string拼接的次数越多,速度则越慢,而StringBuilder则几乎不怎么变化!

string与StringBuilder的性能问题看上去可能很多人觉得没什么,但是一旦操作的次数多了,那么速度就很明显的显示出来了!

我把所有的关于string的操作都改成了 StringBuilder来操作,再看CMS的生成速度可以达到每秒钟生成300条新闻了!属蛇的人2012年运程属猪的人2012年运程2013年运程2012年运程属虎的人2012年运程

声明:我们的CMS是在配置为 windows2003 vps 服务器, 内存为 1G,数据库为Sqlserver2000,新闻数据量为:20万的的情况下进行测试的,

这样基本已经可以满足我们的要求了!

写程序注意细节,尤其是在搭建比较大型的项目时,细节可能就决定了成败!

(责任编辑:IT教学网)

更多

推荐FTP服务器文章