众所周知, 在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对象是可以改变的)
|