为什么 String 在 Java 中是不可变的?
在Java中String类其实就是对字符数组的封装。JDK6中,value是String封装的数组,offset是String在这个value数组中的起始位置,count是String所占的字符的个数。在JDK7中,只有一个value变量,也就是value中的所有字符都是属于String这个对象的。这个改变不影响本文的讨论。除此之外还有一个hash成员变量,是该String对象的哈希值的缓存,这个成员变量也和本文的讨论无关。在Java中,数组也是对象(可以参考我之前的文章java中数组的特性)。所以value也只是一个引用,它指向一个真正的数组对象。其实执行了Strings=“ABCabc”;这句代码之后,真正的内存布局应该是这样的:
value,offset和count这三个变量都是private的,并且没有提供setValue,setOffset和setCount等公共方法来修改这些值,所以在String类的外部无法修改String。也就是说一旦初始化就不能修改,并且在String类的外部不能访问这三个成员。此外,value,offset和count这三个变量都是final的,也就是说在String类内部,一旦这三个值初始化了,也不能被改变。所以可以认为String对象是不可变的了。