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

讨论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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值