String 的不可变性

在猫眼的面试中被面试官问到为何String的字符串是不变的。当时个人回答是由于String类是用final关键字修饰的,当被问到为何用 final修饰就是不可变的时候我发现本身说的并无什么道理。以后本身专门查了一下为何。面试

String的不变性,以下图所示,当你改变了s的以后s指向了一个新的对象原对象不作改变。数组

clipboard.png

看一下源码是怎么实现的:spa

clipboard.png

咱们看到String被定义为final,因此说String是不可继承的,接着咱们看到String的内部实现是一个char数组,而且定义为final。这时有些人可能认为final修饰的字段建立之后就不可改变,因此就完了,但其实不是这样的。设计

由于虽然value是不可变,也只是value这个引用地址不可变。但其引用的Array数组是可变的。code

final int[] value={1,2,3};
value[2]=100;  //这时候数组里已是{1,2,100}

因此根本上String是不可变的缘由是sun工程师很好的封装了value数组,在其中全部的方法中不去更改value数组,并把它定义为private,而且把整个String设成final禁止继承,避免被其余人继承后破坏。因此String的不可变性的关键并非final的做用。对象

同时Java编写者为了不由于String的不可变性致使占用大量空间,为此设计了字符串常量池继承

String one = "someString";
String two = "someString";

clipboard.png

相关文章
相关标签/搜索