为什么String是final的

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也不会再改变了,我保证这是最后一次麻烦你了”。

欢迎加入博主微信公众号,大家一起学习进步
在这里插入图片描述

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值