Java String是不可变的(immutable)

原文:Diagram to show Java String’s Immutability
翻译:get-set


有几个图表来说明Java String的不变性。

1. 声明一个String

String s = "abcd";

s保存了对字符串对象abcd的引用,如下图中的箭头。
这里写图片描述

2. 将字符串赋值给另一个字符串变量

String s2 = s;

s2保存了同样的引用值,因为是同样的字符串对象。
这里写图片描述

3. 字符串相加

s3 = s + "ef";
s4 = s3 + "gh";

本文的几张图跟原文都有不同,不同在于字符串保存的位置。
这里写图片描述
原文将ss2都放到堆内存中,这是错误的。双引号创建的字符串会自动作为常量保存在方法区里的常量区,即使是"abcd"+"ef"这样的字符串由于编译期优化,也是直接作为"abcdef"字符串对象直接放到常量区的。
s3 = s + "ef";中,由于s是变量,因此编译器会将s3放到堆内存中。而s4并未指向s3原本的对象,却从新创建了一个拼接后的字符串对象,可见String是不可变的对象。

总结

一旦字符串在内存中创建,它就是不可变的,所有的对String的操作都不会改变对象本身,而是重新创建一个对象。
如果我们需要一个可以修改的字符串,我们需要使用StringBuilderStringBuffer。否则,会出现许多需要被GC收集的字符串“垃圾”。

关于字符串的创建或操作在内存中的位置,请参考触摸java常量池

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值