C# 中String与StringBuilder (转载)

转载至

1、什么时候使用String,什么时候使用StringBuilder?

  • 字符串一旦创建就不可修改其大小,所以对字符串添加或删除操作比较频繁时,就不要用String,而用StringBuilder。
    例如:

           String a1="abc"; //分配固定大小
           a1+="def"; //销毁原先的数据在来分配,代价比较昂贵
           
           StringBuilder sb=new StringBuilder(20); //指定分配大小
           sb.Append('abc');  //分配到堆区 
           sb.Append('def');  //不会被销毁
    
  • 总结:上面的a1和sb在输出结果一样的。但是在内存分配上来说就区别很大了

String 与StringBuilder的区别

  • String申明后再内存中大小是不可修改的,而StringBuilder可以自由宽展大小(String分配在栈区,StringBuilder分配在堆区)

  • 1、String

      String s1=new String(new char[]{'c','h','i','n','a',});
    
  • 2、StringBuilder

      StringBuilder sb=new StringBuilder(5); //当指定分配大小之后,性能就会得到提升。如果超过指定大小系统会当前大小倍增,也就是10,15,20 这样。建议指定大小
      sb.Append('china');
    

内存分配图

  • 3、知道它们是如何分配之后就可以很好的区别“==”,“Equals”,“Object。ReferenceEquals(Obj1,Obj2)”。它们的不同了。

    1️⃣、在讲双=号这之前,先说一下,java程序员看到这里可能会有点懵。在java中String类型都是放在堆中的。而C#不同,微软堆String类型进行了优化

    2️⃣、微软处理字符串的时候用到“散列表”:它是什么呢?简单理解就是当你创建了字符串“china”的时候,当你在创建这个字符串的时候,编译器是不会再去开辟新的内存来存储的。它会指向第一次创建的地址。

    3️⃣、看如下代码

         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
    

图解

  • 4、总结:
  •    1、==它是比较的栈里面的值是否相等(值比较)
       2、Equals它比较的是堆里面的值是否相等(引用地址值比较)
       3、Object.ReferenceEquals(Obj1,Obj2) 它是比较的是地址是否相等
    

具体想要了解这三者关系可以查阅下面的连接:
C# ==、Equals、ReferenceEquals 区别与联系 (转载)

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值