stringbuilder循环,StringBulider
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 万个信息,统计时长