【问题标题】:Strings and string builder字符串和字符串生成器
【发布时间】:2010-01-04 04:26:59
【问题描述】:

.NET 中的字符串和字符串生成器有什么区别?

【问题讨论】:

标签: .net string stringbuilder


【解决方案1】:

字符串是不可变的类型。在执行 很多 字符串操作(如连接)时,它的性能特征很差。

另一方面,Stringbuilders 通过保持不断增长的缓冲区来克服这个弱点,这样每次连接都不太可能需要分配新的字符串。

由于字符串生成器会增加一些开销,因此只有在需要完成一些重要的字符串工作时(例如在循环中),它们才真正需要。如果您的代码很快,请不要担心。如果不是,请使用分析器查看此问题对您的情况是否重要。

最后一点:这个答案实际上与 ASP.NET 无关——对于所有 .net 和许多其他语言中的字符串也是如此。

【讨论】:

  • 我认为你的最后一段实际上比所有“真实”的答案更重要。
【解决方案2】:

http://en.csharp-online.net/CSharp_String_Theory%E2%80%94String_vs._StringBuilder

基本上,Strings 是不可变的 - 每次操作时都需要在内存中重新创建。 StringBuilder 在内存上更容易,在处理重复的字符串连接和其他操作性操作时,几乎在所有情况下都更快。

您可能会在此 SO 帖子中找到更好的讨论:String vs. StringBuilder

【讨论】:

    【解决方案3】:

    string 是 immutable 并且 stringbuilder 是可变的。

    面向对象和函数式 编程中,不可变对象是 无法修改状态的对象 创建后。这是在 与可变对象相反,它 创建后可以修改。

    不可变对象通常很有用 因为一些昂贵的操作 可以省略复制和比较, 简化程序代码和 加速执行。然而,制作一个 对象不可变通常是 如果对象包含 大量可变数据。 正因为如此,许多语言允许 对于不可变和可变 对象。

    每次对字符串对象进行连接时,都会创建一个带有新引用的新字符串对象,并将其分配给该对象。较旧的对象仍将存在于内存中。

    【讨论】:

      【解决方案4】:

      我想从 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 的值)的值没有改变。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-07-14
        • 1970-01-01
        • 1970-01-01
        • 2014-01-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多