stringbuilder怎么清空(stringbuilderdelete)

http://www.itjxue.com  2023-02-20 18:44  来源:未知  点击次数: 

C#,stringbuilder声明一个对象SBX,值为123,而SBX。Append是在字符123后面追加字符,串动态分配空间,

你的解决方法是啥?

把123 remove?然后把fgh添加进去么?

还是 SBX=null?

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

c#怎么清空stringbuilder

1\stringBuilder = null;//直接赋空值

2\stringBuilder = new StringBuilder();//重新实例化对象,可再次使用

3\stringBuilder.Dispose();//销毁对象

4\using(StringBuilder stringBuilder = new StringBuilder){//自动销毁对象,用完即消

//处理代码

}

StringBuilder怎么用?

创建新的 String 对象相关的系统开销可能会非常昂贵。如果要修改字符串而不创建新的对象,则可以使用 System.Text.StringBuilder 类。例如,当在一个循环中将许多字符串连接在一起时,使用 StringBuilder 类可以提升性能。

通过用一个重载的构造函数方法初始化变量,可以创建 StringBuilder 类的新实例,正如以下示例中所阐释的那样。

StringBuilder MyStringBuilder = new StringBuilder("Hello World!");

设置容量和长度

虽然 StringBuilder 对象是动态对象,允许扩充它所封装的字符串中字符的数量,但是你可以为它可容纳的最大字符数指定一个值。此值称为该对象的容量,不应将它与当前 StringBuilder 对象容纳的字符串长度混淆在一起。例如,可以创建 StringBuilder 类的带有字符串“Hello”(长度为 5)的一个新实例,同时可以指定该对象的最大容量为 25。当修改 StringBuilder 时,在达到容量之前,它不会为其自己重新分配空间。当达到容量时,将自动分配新的空间且容量翻倍。可以使用重载的构造函数之一来指定 StringBuilder 类的容量。以下代码示例指定可以将 MyStringBuilder 对象扩充到最大 25 个空白。

StringBuilder MyStringBuilder = new StringBuilder("Hello World!", 25);

另外,可以使用读/写 Capacity 属性来设置对象的最大长度。以下代码示例使用 Capacity 属性来定义对象的最大长度。

MyStringBuilder.Capacity = 25;

EnsureCapacity 方法可用来检查当前 StringBuilder 的容量。

也可以查看或设置 Length 属性。如果将 Length 属性设置为大于 Capacity 属性的值,则自动将 Capacity 属性更改为与 Length 属性相同的值。如果将 Length 属性设置为小于当前 StringBuilder 对象内的字符串长度的值,则会缩短该字符串。

修改 StringBuilder 字符串

方法名 使用

StringBuilder.Append 将信息追加到当前 StringBuilder 的结尾。

StringBuilder.AppendFormat 用带格式文本替换字符串中传递的格式说明符。

StringBuilder.Insert 将字符串或对象插入到当前 StringBuilder 对象的指定索引处。

StringBuilder.Remove 从当前 StringBuilder 对象中移除指定数量的字符。

StringBuilder.Replace 替换指定索引处的指定字符。

Append

Append 方法可用来将文本或对象的字符串表示形式添加到由当前 StringBuilder 对象表示的字符串的结尾处。以下示例将一个 StringBuilder 对象初始化为“Hello World”,然后将一些文本追加到该对象的结尾处。将根据需要自动分配空间。

StringBuilder MyStringBuilder = new StringBuilder("Hello World!");

MyStringBuilder.Append(" What a beautiful day.");

Console.WriteLine(MyStringBuilder);

此示例将 Hello World! What a beautiful day. 显示到控制台。

AppendFormat

AppendFormat 方法将文本添加到 StringBuilder 的结尾处,而且实现了 IFormattable 接口,因此可接受格式化部分中描述的标准格式字符串。可以使用此方法来自定义变量的格式并将这些值追加到 StringBuilder 的后面。以下示例使用 AppendFormat 方法将一个设置为货币值格式的整数值放置到 StringBuilder 的结尾。

int MyInt = 25;

StringBuilder MyStringBuilder = new StringBuilder("Your total is ");

MyStringBuilder.AppendFormat("{0:C} ", MyInt);

Console.WriteLine(MyStringBuilder);

此示例将 Your total is $25.00 显示到控制台。

Insert

Insert 方法将字符串或对象添加到当前 StringBuilder 中的指定位置。以下示例使用此方法将一个单词插入到 StringBuilder 的第六个位置。

StringBuilder MyStringBuilder = new StringBuilder("Hello World!");

MyStringBuilder.Insert(6,"Beautiful ");

Console.WriteLine(MyStringBuilder);

此示例将 Hello Beautiful World! 显示到控制台。

Remove

可以使用 Remove 方法从当前 StringBuilder 中移除指定数量的字符,移除过程从指定的从零开始的索引处开始。以下示例使用 Remove 方法缩短 StringBuilder。

StringBuilder MyStringBuilder = new StringBuilder("Hello World!");

MyStringBuilder.Remove(5,7);

Console.WriteLine(MyStringBuilder);

此示例将 Hello 显示到控制台。

Replace

使用 Replace 方法,可以用另一个指定的字符来替换 StringBuilder 对象内的字符。以下示例使用 Replace 方法来搜索 StringBuilder 对象,查找所有的感叹号字符 (!),并用问号字符 (?) 来替换它们。

StringBuilder MyStringBuilder = new StringBuilder("Hello World!");

MyStringBuilder.Replace(’!’, ’?’);

Console.WriteLine(MyStringBuilder);

此示例将 Hello World? 显示到控制台。

StringBuilder 你不知道的骚操作

在 String你还需要知道这些细节 中提到过,由于String被设计成immutable,所以才有了StringBuilder和StringBuffer这2个类来帮助我们操作字符串,StringBuilder线程不安全,StringBuffer线程安全,在我们大多数日常使用场景,都是单线程操作字符串,所以StringBuidler用的会多一些,而且编译器也会默认帮我们将+号字符串拼接转化为StringBuidler append,这篇文章我会跟大家分享我知道的StringBuilder使用的一些骚操作。

这个问题只要看下Jdk的源码就能清楚

底层数据结构很简单,就是一个char[] value 和大小字段 count,构造器生成的char[] 默认capacity大小是16,如果很明确插入的字符串很长,应该将capacity设置大一些,避免频繁拷贝数组扩容。

接下来,我们看下StringBuilder 插入删除的实现

可以看到,由于是基于数组实现的,所以插入删除的效率都不会太高,毕竟都要进行数组的拷贝,但是也不必太过担心,System.arrayCopy的速度还是很快的。

这里我想提一点,append和insert方法都能增长字符串,该如何选择,看上面的源码可以看到,insert不论字符串插入的位置是在中间还是最后,都会进行数组拷贝,而append则会根据当前数组的长度来判断是否需要拷贝扩容,所以如果需要在尾部增加字符串使用append,其他位置使用insert。

我们看一下StringBuilder append方法

可以看到,在字符数组大小不足够容纳新的字符的时候,会进行扩容,而扩容后的大小是原来数组的大小+新字符串的长度,所以这里的扩容策略是非常保守的,只能够容纳这一次的append操作,所以如果我们要在循环内频繁进行append操作,可以将StringBuilder初始大小capacity设置大一些,避免频繁扩容数组拷贝

平常我们使用的Jdk集合类,如ArrayList,HashMap等都会有clear方法来清空数据,但是StringBuilder没有提供这个方法,那我们如何清空StringBuilder中的数据呢,难道非要循环去调用delete?当然不用,StringBuilder另外给我们提供了setLength方法,参数传0,就达到了清空数据的作用。

通过源码可以看到,setLength方法,当传入的新length小于原来的count时,只是简单的将count设为新length,并不会去动原来的字符数组value,相当于count是一个指针,只是在移动指针,避免了数组拷贝,效率比较高。这个又引出了一个新问题,既然setLength不会去改变value数组,那value占用的内存怎么释放呢?

StringBuilder 提供了trimToSize方法

以上(安排的很明白),水平有限,各位大佬轻点喷??

(责任编辑:IT教学网)

更多