【发布时间】:2010-01-04 04:26:59
【问题描述】:
.NET 中的字符串和字符串生成器有什么区别?
【问题讨论】:
标签: .net string stringbuilder
.NET 中的字符串和字符串生成器有什么区别?
【问题讨论】:
标签: .net string stringbuilder
字符串是不可变的类型。在执行 很多 字符串操作(如连接)时,它的性能特征很差。
另一方面,Stringbuilders 通过保持不断增长的缓冲区来克服这个弱点,这样每次连接都不太可能需要分配新的字符串。
由于字符串生成器会增加一些开销,因此只有在需要完成一些重要的字符串工作时(例如在循环中),它们才真正需要。如果您的代码很快,请不要担心。如果不是,请使用分析器查看此问题对您的情况是否重要。
最后一点:这个答案实际上与 ASP.NET 无关——对于所有 .net 和许多其他语言中的字符串也是如此。
【讨论】:
http://en.csharp-online.net/CSharp_String_Theory%E2%80%94String_vs._StringBuilder
基本上,Strings 是不可变的 - 每次操作时都需要在内存中重新创建。 StringBuilder 在内存上更容易,在处理重复的字符串连接和其他操作性操作时,几乎在所有情况下都更快。
您可能会在此 SO 帖子中找到更好的讨论:String vs. StringBuilder。
【讨论】:
string 是 immutable 并且 stringbuilder 是可变的。
面向对象和函数式 编程中,不可变对象是 无法修改状态的对象 创建后。这是在 与可变对象相反,它 创建后可以修改。
不可变对象通常很有用 因为一些昂贵的操作 可以省略复制和比较, 简化程序代码和 加速执行。然而,制作一个 对象不可变通常是 如果对象包含 大量可变数据。 正因为如此,许多语言允许 对于不可变和可变 对象。
每次对字符串对象进行连接时,都会创建一个带有新引用的新字符串对象,并将其分配给该对象。较旧的对象仍将存在于内存中。
【讨论】:
我想从 Java 的角度回答您的问题,尽管 .Net 中的概念是相同的。在Java中,我们有一个包(包是类的集合),称为java.lang,String和StringBuilder是属于这个包的两个类,可以被其他类用来创建实例。现在,b/w String 和 String builder 的区别在于 String 对象是不可变的,这意味着这些对象的内容不能被修改,因为它们是常量,而 StringBuilder 类的对象是可变的,这意味着它们的内容可以被修改。
例如:-
package anypackagename;
package learningJava;
public class DemoString
{
public static void main(String... args)
{
StringBuilder S2 = new StringBuilder("My name is");
System.out.println("S2 is: "+S2 );
System.out.println("Hashcode of S2 before append "+ S2.hashCode());
String S1 = "I live in";
System.out.println("S1 is: "+S1 );
System.out.println("Hashcode of S1 before concat "+ S1.hashCode());
diff(S1,S2);
}
public static void diff(String S1, StringBuilder S2)
{
System.out.println("\n" );
S2 = S2.append(" Amritansh Upadhyay");
System.out.println("S2 is: "+S2 );
System.out.println("Hashcode of S2 after after " +S2.hashCode());
S1 = S1.concat("Bangalore");
System.out.println("S1 is: "+S1 );
System.out.println("Hashcode of S1 after concat" +S1.hashCode());
}
}
Hashcode(Ref 变量 S1 的值)被附加的 String 改变,但(Ref 变量 S2 的值)的值没有改变。
【讨论】: