> 文章列表 > String的不可变特性

String的不可变特性

String的不可变特性

1 问题

如何理解“String是不可变的,但是可以变”?

2 方法

(1)String的不可变特性体现在内容和长度

首先在idea中点开查看String这个类是如何定义的

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中关于反射机制的问题。