要想了解String类型为什么不可变,我们先来了解一下什么是不可变?
引言
不可变
不可变就是指这个类,一旦被实例之后,无法修改类的状态以及内容。
看到这个代码之后,有人说这个不是变了吗?我们来画个图理解一下
左边为栈,右边为堆。
注意这里所说的不可变,不是指内容不可变,而是指string这个引用对象不可发生变化,没有任何改变。这是重新指向了另一个字符串的意思。
1.String类型为什么不可变
要想了解string类型为什么不可变,看string官方源码是最好的选择
String类型为什么不可变,我总结了一下三个原因:
①final修饰的类
首先我们看到这个类是被final修饰的,这就意味着这个类是不可以被继承和重写的,就破坏了string这个类可变的性质
②final修饰的常量
其次,我们看到的这个数组是被final修饰的,被final修饰的数组是也是不可改变的(当然这里指的也是数组的地址)。
将一个数组指向到另一个数组上,编译器直接报错
③private修饰的数组
最后是private进行封装、修饰的这个数组,没有提供任何方法,也是无法被外部使用改变的。
最后值得一提的是:如果你想利用String其他API方法,去修改这个数组也是万万不可能的,他也会重新创建一个string对象,这里也可以看一个源码