String为什么是不可变的?

一、String字符串类型的数据结构

首先,String类是由 final 关键字修饰,这说明String 不可被继承。其次,由源代码可以看出String的成员字段value是一个char[ ]数组,在后面所有的String方法里都不提供修改Array数组的方法,没有暴露内部成员变量,而且是用 private  final修饰的;private的私有访问权限都比final大,且整个String设计成final禁止继承,避免被其他人继承后破坏。

注:jdk1.8及以前String使用的是char数组,jdk1.9及以后使用的是byte数组!

图1  jdk1.8及以前char[ ]数组的String源代码

图2  jdk1.9及以后byte[ ]数组的String源代码

二、每次修改,都会产生一个新的字符串

String类的成员字段value是个char[ ]数组,且是final修饰的。final修饰的字段创建以后就不可以改变(指value这个引用地址不可以改变)。但是Array数组是可变的,String类型的所有改变内部存储结构的操作都会New出一个新的String对象(:repace、subString、repalceAll等等)。

即,进行这些操作就是在堆内存中创建一个新的对象,然后value指向不同的对象,原字符串还是不可变!

图3  subString()方法返回新的对象 

自此,String不可变的两点原因我们就轻松学到啦!希望对需要的小伙伴有所帮助 !!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

冷酷无情小美

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值