讨论String不可变,我们首先需要弄清楚的一点,不可变是指的什么不可变!
以我的理解,String不可变是指,当String对象创建之后,这个创建的对象就不会再发生变化
看下面这段代码:
public class String_1 {
public static void main(String[] args){
String a = "test123456";
System.out.println("a = " + a);
a.replace('test', '0');
System.out.println("a = " + a);
}
}
结果输出为:
a = test123456
a = test123456
虽然中间使用replace()方法替换a中的‘1’为‘0’,但是最终输出的结果还是没有变,这是为什么呢?看看下面这张图
字符串作为一个对象,a只是对其的一个引用,相当于一个指针指向"test123456",当使用replace()方法替换其中的'1'为'0'时,内存中又新建了一个对象,但是原来a指向的字符串的值还是没有变化,所以最终输出的值都为"test123456"。
但如果像下面这样写的话,就会有所不同:
public class String_2 {
public static void main(String[] args){
String a = "test123456";
System.out.println("a = " + a);
a = a.replace('1', '0');
System.out.println("a = " + a);
}
}
结果为:
a = test123456
a = test023456
这里最后输出a的值有了变化,用图说明如下:
这是由于 a = a.replace('1', '0');此时a已经指向了新生成的对象,而不是原先的"test123456",所以最后输出a的值会发生变化,但是原来的"test123456"还存在内存当中。
查看Stringl类的源码,你可以发现在String类内部其实使用final char[]数组来存储数据的,由于用final修饰,所以该数组不能再改变,String类具体定义可以去看看源码。
总结:
- String不可变是指最初定义时的值不会改变;
- 由于String是对象类型,我们只是去引用这个对象,如果这个引用的指向发生改变,则它引用的值也会变化
参考:http://blog.csdn.net/zhangjg_blog/article/details/18319521