Java中String的不可变性和创建String的内存变化

本文探讨了 Java 中 String 类型的不可变性特点及其内存分配方式,解释了 String 对象为何能在常量池中共享,以及不同情况下字符串创建与比较的行为差异。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

String的不可变性并不是指它的值不可变,而是原来那块所占的内存不能修改


比如说:String s="123"    s ="12345" 这时候s的值变了,并不是覆盖了原有堆内存中,而是重新在堆中创建的新的内存区域并将s引用指向了新内存。


ps:StringBuffer和StringBuilde可以在原内存块基础上修改,不需要创建新的内存区域。StringBuffer线程安全效率不高,StringBuilder线程不安全效率高


2.创建String内存如何进行分配

2.1 String str="123" 会在常量池划分内存区域 然后在堆内存划分区域。若第二次又出现 String strs="123" .Jvm会去常量池中看是否存在相同内容的字符串。若存在引用指向strs.所以strs str引用地址一样 str==strs 所以为true

2.2 String str="123"  String str2="12"+"3"  编译器会自动合并str2 发现内容一样 地址就一样

2.3 String s1="123" String s2="1"  String s3=s2+"23" 虽然s3和s1内容一样 但是比较会抛出false,因为编译器在编译期间无法确定s2的值,所以会分配新地址给s3, 所以比较地址时就不一样

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值