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