用 StringBuilder 类替代 String

.NET中我们经常要用到文本对象,一般的操作是定义一个string mystr,然后用mystr+="aaaa"之类的运算来累加.其实还有一个效率高得多的方法:使用 System.Text.StringBuilder 类,该类提供了更高的性能.
举例:我们通常会这么写:
String begin_query = "select UPPER(MachineName) As MachineName, "+"LOWER(MachineOwner) As MachineOwner, Status, "+ "StartTime from NET_STRESS WHERE ";
String end_query = " AND StartTime > '" + startTime + "'AND StartTime < '" + endTime + "'";
String query = begin_query + GetWhereClause("PASSED") + end_query;


用StringBuilder类这么写:

StringBuilder begin_query = new StringBuilder();
begin_query.Append("select UPPER(MachineName) As MachineName ");
begin_query.Append("LOWER(MachineOwner) As MachineOwner, Status, ");
begin_query.Append("StartTime from NET_STRESS WHERE ");

StringBuilder end_query = new StringBuilder();
end_query.Append(" AND StartTime > '");
end_query.Append(startTime);
end_query.Append("' AND StartTime < '");
end_query.Append(endTime);
end_query.Append("'");

String query = begin_query.Append(GetWhereClause("PASSED")).Append(end_query).ToString();

其实这个例子中性能的提高有限,毕竟串长度很短,阿猫写的一个程序需要动态生成大约500K的报表页面,用STRING需要40-60秒,用StringBuilder只需<10秒,效率提高太多了.  

 

 

 

 

 

 

 

using System.Text;

String类的不可改变性使它更像一个值类型而不是一个引用类型。其副作用是每次执行字符操作时,都会创建一个新的String对象。StringBuilder 类解决了对字符串进行重复修改的过程中创建大量对象的问题。

StringBuilder 类的一些属性与方法

 

--------------------------------------------------------------------------------

Length 属性并不是只读的。
StringBuilder sb=new StringBuilder("I live the language");
Console.WriteLine(sb.ToString( )); 
sb.Length = 6;
//Displays "I live"
Console.WriteLine(sb.ToString( ));

Capacity 属性
描述:当前为实例分配的字符数量。默认容量是16,如果将一个字符串作为参数提供给构造函数,容量以最接近 2 的幂的值。

MaxCapacity 属性
描述:这个实例中可以被分配的字符最大数量。

Append(  ) 方法
描述:追加给定值的字符串表示。
StringBuilder sb=new StringBuilder( );
Console.WriteLine( sb.Capacity+"/t"+sb.Length );
sb.Append ( 'a' , 17 )
Console.WriteLine( sb.Capacity+"/t"+sb.Length );
16      0 <== 输出
32      17

EnsureCapacity( Int capacity )  方法
描述:如果当前容量小于指定容量,内存分配会增加内存空间以达到指定容量。

Replace( Char oldchar,Char newchar )  方法
描述:用newchar替换oldchar。

Replace( String oldstring,String newstring ) 方法
描述:用newstring替换oldstring。

Replace( Char oldchar,Char newchar,Int  startpos,Int count ) 方法
描述:从startpos到count-1之间用newchar替换oldchar。

Replace( String oldstring,String newstring,Int startpos,Int count ) 方法
描述:从startpos到count-1之间用newstring替换oldstring。

ToString( ) 方法
StringBuilder sb=new StringBuilder( "I live this game" );
String s1=sb.ToString( );         //Displays "I live this game"
String s2=sb.ToString(3,4);     //Displays "live"
在这里第二个ToString( )方法调用了String类的Substring( )方法
public String ToString( int startIndex,int length )
{
  return m_String.Substring( startIndex,length );
}

### StringBuilderString 的区别及用法 #### C# 中的字符串操作性能差异 在 C# 中,`string` 是不可变的对象,这意味着每次对 `string` 进行修改都会创建一个新的对象实例。这使得频繁修改字符串的操作变得低效,尤其是在循环中多次拼接字符串时。 ```csharp // 使用 string 拼接多个字符串 string result = ""; for (int i = 0; i < 1000; i++) { result += "a"; } ``` 与此相反,`StringBuilder` 提供了一种可变的字符序列容器,在执行大量字符串连接操作时效率更高。它允许通过追加、删除或替换部分文本而不必每次都分配新的内存空间[^1]。 ```csharp // 使用 StringBuilder 来优化字符串构建过程 var sb = new System.Text.StringBuilder(); for (int i = 0; i < 1000; i++) { sb.Append("a"); } string optimizedResult = sb.ToString(); ``` #### Java 中的实现方式对比 Java 同样区分了这两种类型的处理方法: - **String**: 不可变;任何改变都将返回新实例。 - **StringBuilder** / **StringBuffer** : 可变;可以在原有基础上做更改而不会产生额外开销。其中 `StringBuffer` 是线程安全版本,通常情况下推荐使用非同步化的 `StringBuilder` 以获得更好的性能表现[^2]。 ```java // Java中的例子 - 非常耗资源的方式 String strConcatenation = ""; for(int j=0;j<1000;j++){ strConcatenation+="b"; } // 更高效的替代方案 StringBuilder javaSbExample = new StringBuilder(); for(int k=0;k<1000;k++){ javaSbExample.append('b'); } String efficientStr = javaSbExample.toString(); ``` 当需要在一个程序里重复地组合大量的短串成更长的结果时,应该优先考虑采用 `StringBuilder` 代替简单的 `+` 或者 `+=` 字符串运算符,从而提高应用程序的整体运行速度并减少不必要的垃圾回收压力。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值