zoukankan      html  css  js  c++  java
  • C# string和StringBuilder区别




    文章参考于https://www.cnblogs.com/wangjq/archive/2012/07/16/2593485.html

    1、区别

    堆和栈的区别
    string创建后分配在字符串常量区,栈中存储的地址指向存储字符串的地址(虽然没存储在堆,但string也是引用类型,这点比较特殊)。大小不可修改,每次使用string类中的方法时,都要再创建一个新的字符串对象,并给其分配内存。
    这样就需要再分配新的空间。所以有可能产生很大的开销。

    StringBuilder创建后分配在堆区,大小可自由修改。

    String a1 = "abc";  //系统分配内存给a1
    a1+="def";  //系统分配新的内存给a1,并让a1重新指向新的内存空间,会产生较多内存开销
    
    StringBuilder sb = new StringBuilder(20);  //指定分配大小。超出容量的话,会自动增倍容量。
    sb.Append("abc");  //分配到堆区
    sb.Append("def");  //不会被销毁,而是直接追加到后面。
    
    

    StringBuilder中常用方法

    StringBuilder sb = new StringBuilder(20);
    
    sb.Append("abc");  //添加字符串到结尾 
    sb.AppendLine("123");  //添加字符串到结尾,并多个回车 
    
    int age = 19;
    sb.AppendFormat("年龄:{0}",age);  //添加格式化字符串到结尾 
    
    sb.Insert(2, "xxx");   //插入字符串到指定字符位置
    
    sb.Remove(2, 1);     //从某个下标开始移除指定长度字符
    
    sb.Replace("x", "111");  //把sb中所有指定字符替换为其他指定字符。
    
    sb.Capacity = 25;   //设置sb对象的最大长度。
    
    sb.Clear("abc");  //删除所有字符
    

    2、代码分析

    值类型是存储在内存中的栈,而引用类型的在栈中存储引用类型变量的地址,其本身存储在堆中。

    1、它是比较的栈里面的值是否相等(值比较)
    对于值类型,如果对象的值相等,则相等运算符 (
    ) 返回 true,否则返回 false。
    对于引用型变量表示的是两个变量在堆中存储的地址是否相同,即栈中的内容是否相同。

    2、Equals它比较的是堆里面的值是否相等(引用地址值比较)

    3、Object.ReferenceEquals(obj1,obj2)它是比较的是内存地址是否相等

    string s1 = "china";
    string s2 = "china";
     
    String s3 = new String(new char[] { 'c', 'h', 'i', 'n', 'a' });
    String s4 = new String(new char[] { 'c', 'h', 'i', 'n', 'a' });
     
    Console.WriteLine(s1 == s2);    //True 
    Console.WriteLine(s1.Equals(s2));   //True
    Console.WriteLine(Object.ReferenceEquals(s1, s2));  //True
    Console.WriteLine("--------------------------");
     
    Console.WriteLine(s3 == s4);    //True  微软对它进行优化,String s1 = new String(new char[] { 'c', 'h', 'i', 'n', 'a' });相当于string s1 = "china";所以上面s1 == s3就为True了。
    Console.WriteLine(s3.Equals(s4));   //True
    Console.WriteLine(Object.ReferenceEquals(s3, s4));  //False
    Console.WriteLine("--------------------------");
     
    Console.WriteLine(s1 == s3);    //True
    Console.WriteLine(s1.Equals(s3));   //True
    Console.WriteLine(Object.ReferenceEquals(s1, s3));  //False
    Console.WriteLine("---------StringBuilder-----------------");
     
    StringBuilder sb1 = new StringBuilder("china");
    StringBuilder sb2 = new StringBuilder("china");
    Console.WriteLine(sb1 == sb2);      //False
    Console.WriteLine(sb1.Equals(sb2)); //True
    Console.WriteLine(Object.ReferenceEquals(sb1, sb2));    //False
    

  • 相关阅读:
    leetcode Super Ugly Number
    leetcode Find Median from Data Stream
    leetcode Remove Invalid Parentheses
    leetcode Range Sum Query
    leetcode Range Sum Query
    leetcode Minimum Height Trees
    hdu 3836 Equivalent Sets
    hdu 1269 迷宫城堡
    hud 2586 How far away ?
    poj 1330 Nearest Common Ancestors
  • 原文地址:https://www.cnblogs.com/Fflyqaq/p/11756111.html
Copyright © 2011-2022 走看看