我们知道,在java中字符串的值是不可改变的,相同的字符串在内存中只会存一份。
为什么说String的值是不可变的呢?
我们看一下String源代码(这里以JDK1.8为例):
public final class String
implements java.io.Serializable, Comparable<String>, CharSequence {
/** The value is used for character storage. */
private final char value[];
String底层是使用final修饰的字符数组value[],来存储字符,而数组是引用类型,引用类型的值是内存中的地址,
地址在初始化之后不可变,所以String的值不可变。
虽然地址不可变,但是地址的内容可以变,String没有对外提供相应的方法来更改值,通过反射可以实现。
例如:通过反射改变字符串内容,把"abc"变成 “a8c”。
package com.li.test;
import java.lang.reflect.Field;
public class Test {
/**
* @param args
* @throws SecurityException
* @throws Exception
*/
public static void main(String[] args) throws Exception {
String s = "abc";
Class clz = s.getClass();
//需要使用getDeclaredField(), getField()只能获取公共成员字段
Field field = clz.getDeclaredField("value");
field.setAccessible(true);
char[] ch =(char[])field.get(s);
ch[1] = '8';
System.out.println(s);
}
}
输出:a8c
在实际开发中,很少需要通过反射来修改String的值。这里只是提供一种思路,在某些情况下可以帮助我们解决一些实际问题。