stringbuilder循环,StringBulider

http://www.itjxue.com  2023-01-13 21:47  来源:未知  点击次数: 

stringbuilder使用循环使用append()会造成内存溢出吗?

会的。

append的调用会使得变量的值原来越大,占用内存也就越来越多,最终会导致溢出。

out of memory

C# String StringBuider 解惑

一个常问的问题

A=B+C+D;

A B C D都是string对象

这是讨论string和stringbuilder的一个常用例子 也喜欢以此来说明stringbuilder比string好

我们说这种方式创建了A B C D B+C B+C+D这样 个对象 而

用stringbuilder创建一个对象 append就行

但实际上

stringbuilder *** =new stringbuilder();

*** Append(A);

*** Append(B);

*** Append(C);

*** Append(D);

*** ToString();

这样也创建了 个对象 当然少创建一个对象也是收获

StringBuilder比String好的地方在于 她初始化的时候分配了一个相对大的空间 如果新加一个对象空间不够的话 会再分配一个是原来 倍大小的一个空间 然后把原来空间的数据复制到新的空间 这个过程是有损性能的

所以StringBuilder适合append一些差不多大小的对象 这样不会引起频繁的内存复制操作

还是回到开始

A=B+C+D;

这种写法真的创建了 个对象吗???????

不一定!!!!

在编译器里面这句可能被优化成A = String Concat(new object[]{B C D});

所以这个例子并不适合于说string和StringBuilder的区别

那StringBuilder到底什么时候用呢

A=B;

A +=C;

A += D;

当有大量的+=的时候 我们才应该考虑StringBuilder

所以我们的StringBuider建议里说循环里面不要用String 因为通常循环里面我们做的事情就是+=

如果只是一次操作 几个对象+的话 实际上编译器会优化A=B+C+D这种表达式 不需要去用StringBuilder

一个常问的问题

A=B+C+D;

A B C D都是string对象

这是讨论string和stringbuilder的一个常用例子 也喜欢以此来说明stringbuilder比string好

我们说这种方式创建了A B C D B+C B+C+D这样 个对象 而

用stringbuilder创建一个对象 append就行

但实际上

stringbuilder *** =new stringbuilder();

*** Append(A);

*** Append(B);

*** Append(C);

*** Append(D);

*** ToString();

这样也创建了 个对象 当然少创建一个对象也是收获

StringBuilder比String好的地方在于 她初始化的时候分配了一个相对大的空间 如果新加一个对象空间不够的话 会再分配一个是原来 倍大小的一个空间 然后把原来空间的数据复制到新的空间 这个过程是有损性能的

所以StringBuilder适合append一些差不多大小的对象 这样不会引起频繁的内存复制操作

还是回到开始

A=B+C+D;

这种写法真的创建了 个对象吗???????

不一定!!!!

在编译器里面这句可能被优化成A = String Concat(new object[]{B C D});

所以这个例子并不适合于说string和StringBuilder的区别

那StringBuilder到底什么时候用呢

A=B;

A +=C;

A += D;

当有大量的+=的时候 我们才应该考虑StringBuilder

所以我们的StringBuider建议里说循环里面不要用String 因为通常循环里面我们做的事情就是+=

lishixinzhi/Article/program/net/201311/13366

如何循环读取StringBuilder中的值(C#)

你的代码有问题,首先

outStoreCalss.Code = reader.ReadLine().Trim();

要改成

outStoreCalss.Code.Append(reader.ReadLine().Trim() + "\r\n");

最后从StringBuilder循环读出这些数据,只要根据\r\n分拆里面的字符串,就ok了

如何遍历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);

C#循环语句

参考代码和注释如下:

using?System;

namespace?LoopDemo

{

????class?Program

????{

????????static?void?Main(string[]?args)

????????{

????????????Q1();//题目1的代码

????????????ShuiXianHua();//题目2的代码

????????????Console.ReadKey();

????????}

????????private?static?void?Q1()?//下面是3个for循环,?如果学了StringBuilder来拼接字符串?那么可以把3个循环写成1个

????????{

????????????//第一步:?生成20个随机数[10,100]之间

????????????int[]?nums?=?new?int[20];

????????????Random?r?=?new?Random();

????????????for?(int?i?=?0;?i??nums.Length;?i++)

????????????{

????????????????nums[i]?=?r.Next(10,?101);//能随即到10,不能随即到101,结果就是[10,100]闭区间的数

????????????}

????????????//第二步:?每行输出5个

????????????Console.WriteLine("数组的全部元素如下:");

????????????for?(int?i?=?0;?i??nums.Length;?i++)

????????????{

????????????????if?((i?+?1)?%?5?==?0)?//因为i从0开始,所以第一个数应该是0+1?,依次类推就是i+1。如果是5,10,15,20这几个数,能被5整除,就换行

????????????????{

????????????????????Console.WriteLine(nums[i]);//换行输出

????????????????}

????????????????else

????????????????{

????????????????????Console.Write(nums[i]?+?"\t");//不换行输出,另外后面追加一个Tab制表符隔开

????????????????}

????????????}

????????????//第三步:?输出能被3整除的数字

????????????Console.WriteLine("能被3整除的数字");

????????????for?(int?i?=?0;?i??nums.Length;?i++)

????????????{

????????????????if?(nums[i]?%?3?==?0)//如果能被3整除

????????????????{

????????????????????Console.Write(nums[i]?+?"\t");//输出

????????????????}

????????????}

????????????Console.WriteLine();

????????}

????????private?static?void?ShuiXianHua()

????????{

????????????Console.WriteLine("三位数的水仙花数如下:");

????????????for?(int?i?=?100;?i??1000;?i++)

????????????{

????????????????int?b?=?i?/?100;?//百位

????????????????int?s?=?i?%?100?/?10;//十位

????????????????int?g?=?i?%?10;//个位

????????????????if?(b?*?b?*?b?+?s?*?s?*?s?+?g?*?g?*?g?==?i)

????????????????{

????????????????????Console.Write(i?+?"\t");

????????????????}

????????????}

????????????Console.WriteLine();

????????}

????}

}

附: 使用StringBuilder来减少for循环次数 ,

命名空间添加1个

using System.Text; //StringBuilder

????????private?static?void?Loop2()

????????{

????????????int[]?nums?=?new?int[20];

????????????Random?r?=?new?Random();

????????????StringBuilder?sb1?=?new?StringBuilder();//可变字符串?,用于输出数字

????????????StringBuilder?sb2?=?new?StringBuilder();//?用于输出能被3整除的数字

????????????for?(int?i?=?0;?i??nums.Length;?i++)

????????????{

????????????????nums[i]?=?r.Next(10,?101);//能随即到10,不能随即到101,结果就是[10,100]闭区间的数

????????????????if?((i?+?1)?%?5?==?0)?//因为i从0开始,所以第一个数应该是0+1?,依次类推就是i+1。如果是5,10,15,20这几个数,能被5整除,就换行

????????????????{

????????????????????sb1.Append(nums[i]?+?Environment.NewLine);//拼接字符串?并且追加换行符

????????????????}

????????????????else

????????????????{

????????????????????sb1.Append(nums[i]?+?"\t");//不换行?,且后面追加一个Tab制表符隔开

????????????????}

????????????????if?(nums[i]?%?3?==?0)//如果能被3整除

????????????????{

????????????????????sb2.Append(nums[i]?+?"\t");//拼接字符串

????????????????}

????????????}

????????????Console.WriteLine("数组的全部元素如下:");

????????????Console.Write(sb1);?//输出

????????????Console.WriteLine("能被3整除的数如下:");

????????????Console.WriteLine(sb2);

????????}

C#基础 StringBuilder 简介

字符串的缺点

当需要对一个字符串变量重复赋值时,在内存中会产生大量的垃圾数据信息。

当重复赋值的频率很高时,执行的效率就会降低。

2.StringBuilder 简介

String,字符串;Builder,构建器;连起来是“字符串构建器”。

StringBuilder 是一个类。SB 类型的变量是引用类型。

StringBuilder 类型的“ 字符串变量 ”,一直操作同一块内存空间, 不会产生垃圾数据 ,且执行效率远远高于 string 类型的字符串变量

StringBuilder 使用方法

1.创建 StringBuilder 类型的变量

StringBuilder sb = new StringBuilder(); ????????//创建一个对象。

注意:StringBuilder 依赖 System.Text 命名空间。

2.往 sb 中追加数据

sb.Append(i);? ? ????????//追加数据。

sb.ToString();????????????//将 sb 转成字符串形式。

演示①:单个数据的追加;

演示②:使用 for 循环循环追加数据。

3.清空 sb 中的数据

sb.Clear();????????????????//将 sb 清空。

StringBuilder 效率测试

1.Stopwatch 类

Stopwatch,秒表计时器,用来记录程序运行的时间。

注意:Stopwatch 依赖 System.Diagnostics 命名空间。

2.创建 Stopwatch 类型对象

Stopwatch sw = new Stopwatch();

sw.Start();????????????//计时器开始。

sw.Stop();????????????//计时器结束。

sw.Elapsed; ????????//开始到结束之间的时长。

3.效率测试

使用 for 循环分别往 string 和 StringBuilder 中追加 5 万个信息,统计时长

(责任编辑:IT教学网)

更多

推荐服务器空间文章