1 问题
如何理解“String是不可变的,但是可以变”?
2 方法
(1)String的不可变特性体现在内容和长度
首先在idea中点开查看String这个类是如何定义的
可以看到这样一行代码:private final char value[];
正是因为这个数组属性形成了String的不可变特性;
内容不可变是因为用private修饰的属性只能在String类的内部才能被访问
长度不可变是因为用final修饰的char[],由于数组创建时必须指定长度,一旦确定不能改变。且又有final修饰,所以数组的地址引用也不可以变。
(2)String可变是可以通过反射的机制去操作String对象中value属性的值;
import java.lang.reflect.Field; public class Test01 { public static void main(String[] args) throws NoSuchFieldException, IllegalAccessException { String s = "abc"; System.out.println(s); //反射String类 Class clazz = String.class; //找到私有属性 Field field = clazz.getDeclaredField("value"); field.setAccessible(true); //获取私有属性的值 char[] value = (char[]) field.get(s); value[0]='1'; value[1]='2'; value[2]='3'; System.out.println(s); } } |
运行代码后,打印第二次s的时候,输出的就是已经修改过后的"123"
3 结语
针对“String是不可变的,但是可以变”的问题,提出了实验的方法,通过反射机制编写相应的代码实验,证明方法是有效的,未来可以继续研究更多Java中关于反射机制的问题。