String类为什么是final的
public final class String implements java.io.Serializable, Comparable<String>, CharSequence {
private final char value[];
......
首先想要弄清楚String类为什么是final的就必须弄清楚final有什么作用。
- final可以说修饰类,方法,变量。被final修饰的类不可被继承,被final修饰的方法无法被重写,被final修饰的变量需要被初始化。
- 从源码中可以看见String实质上是一个字符数组,而且数组被final修饰,这表示引用不可变,实质上数组内容是可以改变的。而且数组是使用private修饰,String也是final修饰,不可被继承,更保证了String不可被修改。
- 为什么说是引用不可修改,实质数组值可以修改,因为jvm里面有堆、栈这两个东西,数组值就存储在堆内存中,而引用存储在栈中,所以变量实际上是一个访问数据的句柄,所以说引用不可修改,如图:具体堆栈等说明后续进行jmm分析的时候会说明。
这个所谓的引用就像高速路口的路标指示牌,这个路标指示牌一经做好是不允许修改的,除非你销毁这个指示牌重新创建一个指示牌,但是所指示的地点里面发生了任何修改,山崩,海啸,扩大面积,这个引用是管不着的。既然fianl所造成的影响确定了,下面就可以分析所带来的的好处了:
1、首先就是安全,一天小字和小符约定一起去堆A区玩儿,小字开车在高速路上按照指示牌走到了堆A区,在这儿和当地的孩子们玩耍并等待小符,这个时候小串也在高速路上,小串是个调皮蛋,在四下无人的时候去修改了指示牌上面的路标,并将一个指向其他地点的指示牌改成了堆A区。吃过早饭的小串也摇头晃脑的来到了指示牌前,走向的堆A区,几天后小符和小字大吵了一架都认为对方放了自己鸽子,他们找来了上帝评评理,上帝笑着说,都不是你们的问题,是我的问题,于是上帝为指示牌加上了final,一经创建,不允许修改,因此轻易了化解了这对小伙伴的矛盾。
2、其次就是节省空间,提高效率。上帝回到了宫殿,擦掉了两鬓的汗珠:“还好那个调皮蛋帮我暴露了这个问题,不然每次有人想去这个地方,我还得新建一个地方给他们用?那这样子我都没地扩大我宏伟的宫殿了,这下好了,只需要开辟一处地方,然后每个可以去堆A区的路口都放一个指示牌就行了,大大的节省了土地与时间呀!”。
3、还有就是HashCode不可变,上帝要修改被调皮蛋弄坏指示牌的命令很快传到了土地公这里,土地公一副苦瓜脸:“你个遭老头子,你知道我是怎么找地点的么,我是根据指示牌上的方向,距离等信息(HashCode)来找这个地点的,这个熊孩子给我把指示牌改了,HashCode一定改变了,我上哪儿去找这个地点去啊,我这个地图已经不准确了!”上帝:“老伙计,别担心,看我该你带来了什么,我给你的指示牌都加上了final标志以后将没有人能修改,HashCode也不会再改变了,我保证这是最后一次麻烦你了”。
欢迎加入博主微信公众号,大家一起学习进步