什么是不可变对象,个人理解,比较简单的来说,就是这个引用所关联对象的信息不会发生变化。众所周知,String对象是不可变的,它是如何做到不可变的呢?如下图所示:
我们发现当给String对象重新赋值的时候,地址值也跟着发生了变化,个人理解当通过""双引号赋值的时候,其实是等同于new 一个对象在字符串常量池里面,只不过如果池里面已经存在对应值的时候,那么直接返回对应的引用,如果没有才会去创建。
翻看String源码:
public final class String
implements java.io.Serializable, Comparable<String>, CharSequence {
/** The value is used for character storage. */
private final char value[];
我们可以发现String其实就是对char做得一层高级的封装,对类声明了final不可继承,保证了String的安全不被篡改,并且对核心变量value也是做了私有和final修饰,保证value不可改变,至少是引用是不会发生改变,但是作为一个数组,里面的值是可以被替换或者发生改变的。而String的不可变巧妙就巧妙在,String类里面的的方法,都很小心没有去动value变量里面的元素。所以String的不可变不单单是将类和value设为final,还在于变量的私有化,还有里面提供的api方法都是安全的,不会去修改核心变量value里面的元素。类似的subString();replaceFirst();等方法,都是返回一个新的String对象,而不会去修改原有的对象的信息。