C#系列之String和StringBuilder

简介: C#系列之String和StringBuilder

前言


     首先和博园的各位打声招呼,小弟在博园呆了也有一年多了。平常一有时间就会过来看看文章,学习各位的经验,现在养成了一种一天不来博园,心里就不踏实的习惯,不知道在看我博文的大哥们有没有这个感觉。


     读归读,理解归理解,所以我现在想把平常所看的,所读的转成自己的理解,记录下来,以便与各位同行们讨论讨论。如果在我博文里有理解错误的,或者没有充分理解的请大胆指出,小弟先在这里拜谢各位了。


  客套话就说到这,下面开始今天的内容。


字符串


  • System.String类

  • System.Text.StringBuilder类


String


  string是各位用的最多的类型之一,是一个特殊的引用类型,直接派生于Object,因此它的值储存在托管堆上。构造一个新字符串的时候,不需要用new。

 


using System;
class Program
{
    static void Main(string[] args)
    {
        string s = "This is right";//这是正确的
        Console.WriteLine(s);
        string b = new String("This is error");//这是错误的
        Console.WriteLine(b);
    }
}
  它是”不可变的“。初始化字符串对象后,该字符串对象的长度、内容都是确定不变的了。这个时候,我们需要更改或者添加字符串,会做一个怎样的动作呢?假如会有这一段代码
using System;
class Program
{
    static void Main(string[] args)
    {
        string s = "I am ";
        s += "Sky";
        Console.WriteLine(s);//我叫Sky
    }
}


  它是”不可变的“。初始化字符串对象后,该字符串对象的长度、内容都是确定不变的了。这个时候,我们需要更改或者添加字符串,会做一个怎样的动作呢?假如会有这一段代码


using System;
class Program
{
    static void Main(string[] args)
    {
        string s = "I am ";
        s += "Sky";
        Console.WriteLine(s);//我叫Sky
    }
}


 

  1、创建一个新的字符串对象b,运行库会为新对象b分配足够的内存,储存新内容“I am Sky”。

  2、变量 s重新指向新对象b。

  3、旧对象a没有被任何变量引用,等待垃圾回收。

 

111847078105830.jpg

 

  由于上面的特性,避免复制同一个字符串的多个对象,会利用CLR的字符串留用机制,减少内存的损耗。


  什么是字符串留用,CLR初始化的时候会创建哈希表,每构建一个新字符串都会与哈希表匹配,查找是否有相同的字符串,如果匹配,就会返回这个已存在的旧对象,由新变量进行引用。否则,就会创建一个字符串副本添加到哈希表里,Key就是字符串,Value就是string对象在堆上的地址。


112118193663955.jpg

112118587215197.jpg

  

  

112127213296881.png


由上面可见a和b的托管堆上地址是一样的。假如用new呢?经小平子补充,new出来的字

符串是不会记录在哈希表的,因此,接下来的字符串与new出来字符串对象是不一样的。

121248523961816.png

121247332128176.png

StringBuilder


  因为string的”不可变“,导致多次修改字符串的时候会损耗性能,那么这个时候StringBuilder的作用就来了。StringBuilder和String比起来,功能较少,只有基本的属性和增删改的方法。


  其实,StringBuilder是由Char数组构成的。构建新的StringBuilder时能设置容量大小,当添加字符串,超过已分配的数组大小时,就会创建一个新的数组,此时容量会翻倍,旧的数据就会等待垃圾回收。


  StringBuilder多数方法都是返回同一个StringBuilder对象,那么这个时候就可以,几个操作一起完成。


using System;
using System.Text;
class Program
{
    static void Main(string[] args)
    {
        StringBuilder sb = new StringBuilder(10);
        string s = sb.AppendFormat("{0} {1}", "Skyer", "Chen").Remove(3,2).Replace(' ','-').ToString();
        Console.WriteLine(s);//显示结果 Sky-Chen
    }
}


目录
相关文章
|
1月前
|
安全 Java
Java StringBuffer 和 StringBuilder 类
Java StringBuffer 和 StringBuilder 类
16 0
|
1月前
|
C#
51.c#:string类的静态方法
51.c#:string类的静态方法
20 1
|
3月前
|
存储 安全 Java
【JAVA基础】String、StringBuilder和StringBuffer的区别——巨详细
String是不可变的,StringBuilder和StringBuffer是可变的。而StringBuffer是线程安全的,而StringBuilder是非线程安全的。
|
2月前
|
存储 XML 缓存
Java字符串内幕:String、StringBuffer和StringBuilder的奥秘
Java字符串内幕:String、StringBuffer和StringBuilder的奥秘
26 0
|
4月前
|
安全 Java 调度
Java基础面试,String,StringBuffer,StringBuilder区别以及使用场景
* String是final修饰的,不可变,每次操作都会产生新的对象。 * StringBuffer和StringBuilder都是在原对象上进行操作 * StringBuffer是线程安全的,StringBuilder是线程不安全的。 * StringBuffer方法是被synchronized修饰的
|
1天前
|
存储 编解码 算法
Java 的 String StringBuilder StringBuffer(上)
Java 的 String StringBuilder StringBuffer
15 0
|
16天前
|
移动开发 安全 Java
String、StringBuffer 、StringBuilder、StringJoiner
String、StringBuffer 、StringBuilder、StringJoiner
|
1月前
|
C#
深入C#中的String类
深入C#中的String类
11 0
|
1月前
|
安全 C#
52.c#:stringbuilder类
52.c#:stringbuilder类
15 1
|
1月前
|
自然语言处理 C# 数据安全/隐私保护
50.c#:string类初始化
50.c#:string类初始化
17 1