参考thinking in java 第13章
String类中每一个看起来会修改String的方法,实际上都是创建一个新的String对象,最初的String毫发无损。(是的,开发人员有意为之)
查阅网络,有人说String不可变是因为String是声明为final的,但是实际上和final没有什么关系。
why?
一、首先我们理清下final关键字的作用
1声明在类上,那么这个类就不能被继承(绝后了),并且其方法默认为final
2声明在方法上,那么这个方法无法被修改(Override)
3声明在变量上,基本数据类型会无法修改(常量),引用类型指向的内存地址无法修改(注意这里只是说指向)
二、那么String的字符串数据是存放在哪里呢?
打开String类瞧一瞧
可以看到,数据是存在value的(可以打开String类的构造方法看一看)
这是一个数组,也就是引用类型,说明我们可以修改
三、怎么修改去它?
先看个例子:final char[] value = new char[];
试图去操作引用指向的地址的时候,编译是不通过的
当我们试图改变内容,发现是可以通过编译的,这样不就可以操作它了吗?
浏览String类,你会发现String并没有提供任何修改的方法或者自己内部修改。
所以,如果我们要修改,也只能通过强大的反射。
四、为什么要让String不可变?String可变会产生什么问题?
String因为不可变付出了很大的代价,每次操作它都有可能会生成许多中间对象,虽然编译器在底层做了很多优化。
String因为不可变,都是创建新对象,所以是线程安全的。
可以想象,当String可变,程序会变得更加混乱,这里可以拿String和StringBuilder做对比。