以下是个人理解(有错误的话请大家指正):
String s1=new String(“Hae”)在内存中是这样的
要是想要运行s1=new String(“he”),系统不是将value指向改变,也不是将value指向的char[]数组值修改,而是重新生成一个对象,看下图:
(灰色的线是之前的指向,虚线也表示释放,实际指向用红线表示)
为什么会这样呢?看看源码的主要部分:
这里的value[]是final的,还记得final关键字的这句话吗?
final 关键字修饰的类不能被继承,修饰的方法不能被重写,修饰的变量是基本数据类型则值不能改变,修饰的变量是引用类型则不能再指向其他对象。所以value不能指向别的对象。验证一下:
所以说String 不可变只不过是说value指向地址不能变,也不是说value[]的值不能变哦,验证一下:
同时,String的指向是可以变的呀,因为它没有用final修饰啊,比如:
它在内存中是这样的:
也可以用final去修饰String哦,不过这样的话你也就懂啦,就是这个String不能指向别的对象,这次是真的改也不能改啦。
String不可变的理解(图)
于 2022-04-01 16:48:21 首次发布