Java String 为啥是不可变的
最近面试问到String对象为啥不可变?因此打算看看源码一看究竟。
1、先看看源码
public final class String
implements java.io.Serializable, Comparable<String>, CharSequence {
/** The value is used for character storage. */
private final char value[];
/** Cache the hash code for the string */
private int hash; // Default to 0
/** use serialVersionUID from JDK 1.0.2 for interoperability */
private static final long serialVersionUID = -6849794470754667710L;
2、先看看大家怎么说
说法一:String类是final修饰。
说法二:value是final修饰。
3、本猿拿证据
1、final修饰的类无子类,不可以被继承,更不可能被重写,可没有说创建的对象不能被修改。所以我认为这不是根因。
2、用final修饰的成员变量表示常量,值一旦给定就无法改变! 这是啥意思呢?意思是说value这个变量不可以被重新赋值。但是数组是引用类型,value指向的那块内存没有限制不能被修改,为此本猿做了个测试。
final char[] value = new char[3];
for (int i = 0; i<value.length ;i++){
value[i] =(char)(56+i);
System.out.println(value[i]);
}
System.out.println("------再次赋值---------");
for (int i = 0; i<value.length ;i++){
value[i] =(char)(64+i);
System.out.println(value[i]);
}
结果
从这个结果本猿再次看源码没有找到,在string里面没有找到修改value指向的那块内存值的方法。
4、本猿结论
String创建的对象不能被修改的原因是,String是个final类,没办法通过继承重写它的方法,它又没有提供修改value指向的内存的值。所以创建之后就没办法修改了。
5、本猿猜想
如果可以得到String对象 value指向的内存是不是就可以让它可变了。