关于Java中的String为什么不可变

来源:互联网 发布:苹果看图软件 编辑:程序博客网 时间:2024/05/17 23:39

讨论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类具体定义可以去看看源码。


总结:

  1. String不可变是指最初定义时的值不会改变;
  2. 由于String是对象类型,我们只是去引用这个对象,如果这个引用的指向发生改变,则它引用的值也会变化

参考:http://blog.csdn.net/zhangjg_blog/article/details/18319521

0 0