String str1 = "myString";
String str2 = "myString";
str1和str2 具有相同的指针 也就是 内存中只有一个myString
如果 改变str1的值 并不会改变myString内存的值 会在内存中重新划分一块区域来存储新的字符串 同时改变str1的指针
StringBuilder则不一样 当你new一个StringBuilder时就会划分一块内存给StringBuilder实例使用 当你Append或Remove或进行其他操作是并不会重新 分配内存 除非你的新字符串长度超过了StringBuilder实例的默认大小才会重新 分配内存
String str2 = "myString";
str1和str2 具有相同的指针 也就是 内存中只有一个myString
如果 改变str1的值 并不会改变myString内存的值 会在内存中重新划分一块区域来存储新的字符串 同时改变str1的指针
StringBuilder则不一样 当你new一个StringBuilder时就会划分一块内存给StringBuilder实例使用 当你Append或Remove或进行其他操作是并不会重新 分配内存 除非你的新字符串长度超过了StringBuilder实例的默认大小才会重新 分配内存
String 或 StringBuilder 对象的串联操作的性能取决于内存分配的发生频率。String 串联操作每次都分配内存,而 StringBuilder 串联操作仅当 StringBuilder 对象缓冲区太小而无法容纳新数据时才分配内存。因此,如果串联固定数量的 String 对象,则 String 类更适合串联操作。这种情况下,编译器甚至会将各个串联操作组合到一个操作中。如果串联任意数量的字符串,则 StringBuilder 对象更适合串联操作;例如,某个循环对用户输入的任意数量的字符串进行串联。(MSDN)
想比直接拼接更省内存
string a = "1";
a = "2";//会开辟新内存
a = a + "3";//会开辟新内存
用stringbuilder就不会开辟