检测String的不可变性及String赋值的实质
String实现
从学习Java不久,就有人跟我讲过String是不可变的,也就是新建出来的String对象就不能够进行改变,对其进行改变会新建一个String对象,并且对其进行赋值。阅读了一下String的源码实现,简单的了解了一下机制。
首先String类是被定义为了final的,然后内部实现的数组也定义为了final,对于这个final的使用,我大概只是了解到在这里是防止String被继承,并且保证String的不可变性的。但是,还是理解不透彻,我就去百度搜了搜,在知乎看到了一个非常有意思的回答,然后自己实现了一下。
1 | public final class String |
首先String的底层是通过一个byte数组来进行实现的,在百度的时候,我查到很多博客或者文章里面给出的String实现都是char数组,是JDK在版本更新改了底层实现。
在我看到的知乎回答里面,对String的不变性有一个非常棒的解释。从实现的数组讲,final Array是不能够对数组里面的数据进行final的,也就是final数组无法阻止数据更变。
String的防止改变的实现是将底层数据私有化,并且没有将内部数据开放,所以才可以实现了String 的不可变性。
String的赋值检测
String的赋值实际上只是对引用的赋值,我写了段代码进行验证。