1 string str1="aa"; 2 3 string str2="aa"; 4 5 6 str1,str2,变量所指向的堆空间的地址是一样的。栈空间的内容是不一样的。 7 8 9 10 //new的作用 11 * 1.开辟合适大小的堆空间或者常量区空间 12 * 2.创建对象 13 * 3.调用构造函数 14 * 4 返回开辟的空间地址 15 string str3 = new string(new char[]{'a','a'}); 16 17 string str4 = new string(new char[]{'a','a'}); 18 19 20 str3,str4,栈空间的地址和堆空间的地址都是不一样的。
![](https://i-blog.csdnimg.cn/blog_migrate/7e4f793e8b6d7cfdad099efec547a16f.jpeg)
![](https://i-blog.csdnimg.cn/blog_migrate/3a38ee9a3243b92feb75e2cf73084582.jpeg)
总结:1.创建一个字符串,系统会先扫描常量区(堆空间),有没有相同值的字符串,如果有,就直接返回对应的常量区(堆空间)地址。
2.如果对字符串进行修改。。。但是无法对字符串进行修改,系统会先扫描常量区有没有修改之后的值,如果有,就直接返回,如果没有,就开辟新的空间返回。