String 为什么不可变?不可变有什么好处?

String在Java中是不可变的,这意味着一旦创建,其内容就不能更改。不可变性源于value数组的final修饰、私有成员变量、内部方法不修改value以及类本身的final属性。不可变性提供了安全性、节省内存(如字符串常量池)、线程安全以及性能提升(如哈希表操作)。Java之父James Gosling推崇不可变性,认为它减少了错误,提高了安全性并有利于缓存。
摘要由CSDN通过智能技术生成

前言

说到String的不可变性,我猜肯定有同学要说可以通过反射来修改。所以我们在分享之前,在这边先出一个反射的题目,大家看看能不能答对。

题目

String name = "jionghui";
Field field = String.class.getDeclaredField("value");
field.setAccessible(true);
char[] value = (char[]) field.get(name);
value[0] = 'a';
System.out.println("jionghui" == name);

大家可以思考一下这个题目,我会在文末给出答案和解析。

不可变是什么意思

不可变类(immutable):类的实例一旦创建后,其内容(状态)就不可改变。

简单理解就是:一个对象一旦被创建后,整个对象就是不可变的。包括属任何性和状态。

可能有同学会拿下面这段代码来说,这不是变了吗?

public void testFinal() {
    String str = "程序员囧辉";
    str = "屌丝囧辉";
}

我们看下第2行代码,这行代码中有两部分组成。

等号左边:一个局部变量 str,类型是 String,这个变量是放在栈上的。

等号右边:一个字符串对象,放在堆中。

我们说的不可变,指的是字符串对象。

我们通过第3行代码,将这个 str 变量赋值为另一个字符串,对原来的字符串对象是没有任何改变的。

final修饰value数组?

我猜有不少同学在回答这个问题的时候,会答说是因为string底层的这个value 数组被 final 修饰,所

评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

程序员囧辉

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

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

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

打赏作者

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

抵扣说明:

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

余额充值