Java字符串的不可变性

声明一个字符串引用变量:

String  s = "abcd";

s是一个引用变量,指向 堆内存中的字符串常量 "abcd"

再声明一个字符串引用变量:

String s2 = s;

把s变量赋值给s2,那么 s 和 s2 两个引用变量同时指向堆内存中的字符串常量 "abcd"

改变字符串:

s = s.concat("ef")

执行连接方法之后,在对内存中产生了两个常量字符串:"abcd"  "abcdef"

并且 s 引用变量重新指向了新的字符串常量:"abcdef"

而 s2 引用还是指向字符串常量:"abcd"

总结:

一个字符串被创建之后,就存在对内存中,并且不能被改变,所有操作字符串的方法都不能改变这个字符串本身,而是返回一个新的方法

如果我们需要一个可以改变的字符串,可以使用StringBuffer或者StringBuilder

另外,如果创建了很多的字符串常量,对于垃圾回收器来回收这些字符串常量所占用的空间将会非常耗时

原文地址:https://www.cnblogs.com/lianliang/p/5320580.html