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");//分配在堆中
上述代码的内存分布如下:
当创建一个新的String并赋值时,如果再新创建一个String并附相同的值时不会开辟新的内存空间而是指向有相同值的String的内存地址; 如:
string s1 = "china";
string s2 = "china";
内存分配:
StringBuilder sb1 = new StringBuilder("china");
StringBuilder sb2 = new StringBuilder("china");
内存分配:
“==”,Equals,Object.ReferenceEquals(obj1,obj2)的不同
- ==是比较栈里的值是否相等,比如 s1与s2相等。
- Equals是比较内存地址里的值是否相等;sb1与sb2相等。
- Object.ReferenceEquals(obj1,obj2)是比较obj1与obj2的内存地址是否相同。所以s1与s2相等,sb1与sb2不相等。