String

string字符串用来表示文本的字符(Char)的顺序集合

String 对象不可变。 每次使用 System.String 类中的方法之一,都要在内存中新建字符串对象,这就需要为新对象分配新空间。 在需要重复修改字符串的情况下,与新建 String 对象关联的开销可能会非常大。

String声明之后在内存中的大小是不可修改的。并且是分配在栈中的。

StringBuilder

因为String对象不可变。并且每次使用String中的方法时都要重新分配空间,特别是在使用String连接字符时。

若要修改字符串(而不新建对象),可以使用 System.Text.StringBuilder 类。 例如,如果在循环中将许多字符串连接在一起,使用 StringBuilder 类可以提升性能。

StringBuilder的容量可以指定,但是当达到容量时将自动分配新的空间且容量翻倍,分配在堆中,栈中存储引用地址。

String与StringBuilder在内存中的分配

string s1 = "china";//分配在栈中
StringBuilder sb = new StringBuilder("china");//分配在堆中

上述代码的内存分布如下:

alt

当创建一个新的String并赋值时,如果再新创建一个String并附相同的值时不会开辟新的内存空间而是指向有相同值的String的内存地址; 如:

string s1 = "china";
string s2 = "china";

内存分配:

alt

StringBuilder sb1 = new StringBuilder("china");
StringBuilder sb2 = new StringBuilder("china");

内存分配:

alt

“==”,EqualsObject.ReferenceEquals(obj1,obj2)的不同

  • ==是比较栈里的值是否相等,比如 s1与s2相等。
  • Equals是比较内存地址里的值是否相等;sb1与sb2相等。
  • Object.ReferenceEquals(obj1,obj2)是比较obj1与obj2的内存地址是否相同。所以s1与s2相等,sb1与sb2不相等。

链接