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

来源:互联网 发布:淘宝店铺怎么装修上新 编辑:程序博客网 时间:2024/05/22 12:30

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, 所以比较地址时就不一样

原创粉丝点击