String 类型值的不可变?

String不可变

很简单,如下图,给一个已有字符串"abcd"第二次赋值成"abcedl*,不是在原内存地址上修改数据,而是重新指向一个新对象,新地址 ![]

 

 

String为什么不可变?

翻开JDK源码,java.lang.String类起手前三行

public final class String
    implements java.io.Serializable, Comparable<string>, CharSequence{
    /** The value is used for character storage. */
    private final char value[];
}

首先String类是用final关键字修饰,这说明String不可继承。

再看下面,String类的主力成员字段value是个char[ ]数组,而且是用final修饰的。final修饰的字段创建以后就不可改变。


有的人以为故事就这样完了,其实没有。因为虽然value是不可变,也只是value这个引用地址不可变。挡不住Array数组是可变的事实。Array的数据结构看下图,


也就是说Array变量只是stack上的一个引用,数组的本体结构在heap堆。String类里的value用final修饰,只是说stack里的这个叫value的引用地址不可变。没有说堆里array本身数据不可变。

不可变有什么好处?

String常量池是方法区的一个特殊的储存区。当新建一个字符串的时候,如果此字符串在常量池中早已存在,会返回一个已经存在字符串的引用,而不是新建一个对象。

posted @ 2022-04-29 16:40  java面试站  阅读(44)  评论(0)    收藏  举报