黑马程序员技术交流社区

标题: (哈尔滨校区java基础班)Java 中的 String对象真的不可变吗? [打印本页]

作者: 董钊    时间: 2015-12-6 18:39
标题: (哈尔滨校区java基础班)Java 中的 String对象真的不可变吗?
众所周知, 在Java中, String类是不可变的。那么到底什么是不可变的对象呢? 可以这样认为:如果一个对象,在它创建完成之后,不能再改变它的状态,那么这个对象就是不可变的。不能改变状态的意思是,不能改变对象内的成员变量,包括基本数据类型的值不能改变,引用类型的变量不能指向其他的对象,引用类型指向的对象的状态也不能改变。
看一下这段代码:
String s = "ABCabc";System.out.println("s = " + s);s = "123456";System.out.println("s = " + s);
打印结果为:
s = ABCabcs = 123456
哇偶  竟然改变了,那么怎么还说String对象是不可变的呢? 其实这里存在一个误区: s只是一个String对象的引用,并不是对象本身,这一点必须明确。
也就是说,s只是一个引用,它指向了一个具体的对象,当s=“123456”; 这句代码执行过之后,又创建了一个新的对象“123456”, 而引用s重新指
向了这个心的对象,原来的对象“ABCabc”还在内存中存在,并没有改变,只不过没有引用指向变成了垃圾。

String中,存在一些方法,调用他们可以得到改变后的值。这些方法包括substring, replace, replaceAll, toLowerCase等。例如如下代码:
String ss = "123456";System.out.println("ss = " + ss);ss.replace('1', '0');System.out.println("ss = " + ss);
打印结果:
ss = 123456ss = 123456
哇偶,设么情况?再次强调, ss只是一个引用, 不是真正的字符串对象,在调用a.replace(‘1’, ‘0’)时, 方法内部创建了一个新的String对象,
并把这个心的对象重新赋给了引用ss。那为什么打印结果没有变呢?是因为方法内部重新创建新的String对象,并且返回这个新的对象,而这段代码没有接收
新建的对象.所以结果出乎意料.

那么String对象真的不可变吗?学到反射时候我再做补充.哈哈 不要失望.有兴趣可以自己查查看.(可以透露一点,String对象是可以改变的)


作者: 许鹏飞    时间: 2015-12-6 19:32
不错,顶楼主




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2