String 这个大家在熟悉不过的基本数据类型,众所周知,String 类型的变量是一个不可变类型,是一个final 类不能有子类,而且多次拼接,会不断的新建String实例,引用不断地重新定位,那么究其根本为什么会是这样?
public final class String implements java.io.Serializable, Comparable<String>, CharSequence {
/** The value is used for character storage. */
private final char value[];
.......
}
从源码我们可以看出String内部通过定义final 类型的字符数组来保存他的值,final类型一旦初始化后就不允许发生改变,所以根本原因在这数组,字符串发生变化,jvm就会新建一块内存区域来存储改变量的值,引用发生改变。
jdk1.7之前字符串常量池在方法区,jdk1.7之后字符串常量池迁移到了堆区,运行时常量池还在方法区(1.7之前的永久代,1.8之后永久代被元数据空间取代,运行时常量池也在元数据空间)。