.NET中的字符串和字符串构建器有什么区别?
答案 0 :(得分:5)
字符串是不可变类型。在执行像串联这样的字符串操作的批次时,它具有糟糕的性能特征。
另一方面,Stringbuilders通过保持不断增长的缓冲区来克服这个弱点,这样每个连接都不太可能需要分配新的字符串。
由于字符串构建器会增加一些开销,因此只有在要完成一些重要的字符串工作时(例如在循环中)才真正需要它们。如果您的代码很快,请不要担心。如果不是,请使用分析器查看此问题是否对您的情况有影响。
最后一点说明:这个答案实际上与ASP.NET无关 - 对于所有.net和许多其他语言中的字符串也是如此。
答案 1 :(得分:1)
http://en.csharp-online.net/CSharp_String_Theory%E2%80%94String_vs._StringBuilder
基本上,String
是不可变的 - 每次操作一个都需要在内存中重新创建。 StringBuilder
更容易记忆,几乎在所有情况下,当你处理重复的字符串连接和其他操作操作时会更快。
您可以在此SO帖子中找到更好的讨论:String vs. StringBuilder。
答案 2 :(得分:1)
字符串是 immutable ,stringbuilder是可变的。
面向对象和功能 编程,一个不可变的对象是一个 状态无法修改的对象 创建之后。这是在 与可变对象形成鲜明对比 可以在创建后进行修改。
不可变对象通常很有用 因为一些昂贵的操作 复制和比较可以省略, 简化程序代码和 加快执行速度。然而,制作一个 对象不可变通常是 如果对象包含a,则不合适 大量可变数据。 因此,许多语言允许 对于不可变和可变的 对象。
每次对字符串对象进行串联时,都会使用新引用创建新的字符串对象,并将其分配给该对象。旧对象仍然存在于内存中。
答案 3 :(得分:0)
尽管.Net中的概念相同,但我想从Java的角度回答您的问题。在Java中,我们有一个称为java.lang的包(一个包是一个类的集合),String和StringBuilder是属于该包的两个类,其他类可以使用它们来创建实例。现在,b / w字符串和字符串生成器的区别是字符串对象是不可变的,这意味着这些对象的内容无法修改,因为它们是常量,而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());
}
}
哈希代码(引用变量S1的值)随附加的字符串更改,但(引用变量S2的值)的值未更改。