1、声明一个字符串:
String s = "abcd"; |
---|
s中存储了一个指向堆内存字符串"adcd"的引用。
2、再声明一个字符串变量,同样指向堆内存的字符串"abcd"。
如上图所示,s和s2都指向"adcd"。
3、对字符串s进行连接操作:
s = s.concat("ef"); |
---|
此时s切断了与之前"abcd"的引用,指向了一个新的字符串"abcdef"。
4、总结:
一旦一个字符串在堆内存中创建,它就不能再被改变。我们需要注意String类的所有操作都会重新创建一个新的字符串返回,而不会改变原有堆内存中的字符串。如果我们对字符串做了很多类似的操作那将会在对内存中创建大量的不可变的字符串,造成大量内存消耗,并且这些没有被引用的字符串需要垃圾回收器去回收,但是垃圾回收也是要消耗内存和cpu的,所以为了程序性能,在遇到需要改变字符串时请使用StringBuffer或者StringBuilder。
本文部分翻译自programcreek