1、什么是不可变对象:
有效final;被private修饰;类不能被继承拓展;类不能对外界提供修改类状态的方法;
2、Java中String类是如何设计成不可变对象的:
首先我们先看如下代码:
public class Demo {
public static void main(String[] args) {
String a="小猫";
System.out.println(a);
a="小狗";
System.out.println(a);
}
}
//此处输出:小猫 小狗
通过上面的代码我们可以看到,a的值的确进行了改变。但是,这里要说明的是,此处的改变,只是一个引用的改变。也就是说,将a的值由“小猫”的引用,转到了“小狗”,而原先的小猫并未改变。如下图:
这里我们来看一下String的源码:
implements java.io.Serializable, Comparable<String>, CharSequence {
/** The value is used for character storage. */
private final char value[];
/** Cache the hash code for the string */
private int hash; // Default to 0
/** use serialVersionUID from JDK 1.0.2 for interoperability */
由上面的源码可以看到,String有一个private final的值——value ,并且这里并没有提供setvalue的方法。所以,此处很明确的表示出,我们创建的每个String对象均由value保存,也就是说真正改变引用的是value,因为value也是一个数组引用。
3、如何改变String呢?
既然提出了这个问题,那么肯定就是有相应的解决办法的——反射;(此处由于答主还没有学习反射,暂不给出解答,但是,反射是能解决很多违反语言规则的方法)
4、为什么Java中的String要设置成不可变:
首先在Java中String类型的使用十分频繁,需要用到大量的增删改查,每次进行增删改查操作前jvm都要检查这个String对象是否安全,即通过hashcode,当将String设计成不可变对象时候,就有效的保证了每次增删改查的时hashcode的唯一性,也就可以放心的操作。
其次,网络连接地址URL,文件路径path通常情况下都是以String类型保存, 若String是可变的,那么将会引起各种安全隐患。