前言
说到String的不可变性,我猜肯定有同学要说可以通过反射来修改。所以我们在分享之前,在这边先出一个反射的题目,大家看看能不能答对。
题目
String name = "jionghui";
Field field = String.class.getDeclaredField("value");
field.setAccessible(true);
char[] value = (char[]) field.get(name);
value[0] = 'a';
System.out.println("jionghui" == name);
大家可以思考一下这个题目,我会在文末给出答案和解析。
不可变是什么意思
不可变类(immutable):类的实例一旦创建后,其内容(状态)就不可改变。
简单理解就是:一个对象一旦被创建后,整个对象就是不可变的。包括属任何性和状态。
可能有同学会拿下面这段代码来说,这不是变了吗?
public void testFinal() {
String str = "程序员囧辉";
str = "屌丝囧辉";
}
我们看下第2行代码,这行代码中有两部分组成。
等号左边:一个局部变量 str,类型是 String,这个变量是放在栈上的。
等号右边:一个字符串对象,放在堆中。
我们说的不可变,指的是字符串对象。
我们通过第3行代码,将这个 str 变量赋值为另一个字符串,对原来的字符串对象是没有任何改变的。
final修饰value数组?
我猜有不少同学在回答这个问题的时候,会答说是因为string底层的这个value 数组被 final 修饰,所