string为什么用final修饰

tring为什么用final修饰

首先回答为什么

为了保证String对象的不可变

那么final是怎么保证String对象的不可变呢?

想要回答这个问题,得先知道final的作用:

首先 类定义上面就用了final修饰。

final修饰的类不可被继承

final修饰的引用在初始化后不可重新赋值

final修饰的方法不可重写

接着要明确String的底层是什么,在jdk8中,String的底层是一个char数组,在String类源码中,有一个成员变量value,它是一个char数组引用,指向了存储Sting对象内容的char数组,value引用使用了final修饰:

————————————————

使用了final引用修饰使得value引用指向的char数组对象不会被改变,但这还不能保证String对象的不可变,虽然对象不变,但是数组的元素却还是可以改变的,对char数组元素的改变同样会使得String对象改变

因此,为了保证String对象内容的不可变,String类的设计师们在实现String提供的各种方法时都避免了对value数组元素的改变,

都是用的新建对象的方式实现的。

——————————————————

String设计成不可变的好处

1.提高效率
String类经常作为哈希表中的key,经常要使用到其hash值,基于String不可变的特性,可以对其hash值进行缓存,减少重复运算,String类有一个成员变量hash,对hash值进行了缓存

2.提高资源的利用率

String是最常用的对象,为了节省内存,基于String不可变的特性,可以实现字符串常量池。

创建String对象前,jvm会先检查字符串常量池中是否存在该对象,若存在则直接返回其引用,否则新建一个对象并缓存进常量池,再返回引用。

字符串常量池避免了重复String对象的创建,节省了内存资源,同时由于减少了对象创建的次数,也提高了程序的执行效率

3.保证线程安全
String是不可变的,因此不必担心String对象会被其他线程改变,天生线程安全

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值