String 是否是真的不变?


说明String 并不是不可改变的,可以通过反射机制来修改string底层的数组。


为什么system.out.println("tracy")也会输出trac_??它其实与system.out.println(a)编译后的字节码是一样的!!
string的internal方法:


jdk1.7后输出 true!!! jdk1.7之后,hotspot将常量池从永久代移到了元空间, intern方法在实现上发生了比较大的改变,它还是会先去查询常量池中是否存在,如果存在直接返回常量池中的引用,如果在常量池找不到对应的字符串,不会将字符串拷贝到常量池(也即不会新生成一个字符串对象)而只是在常量池中生成一个对原字符串对象的引用。因为常量池中没有str01这个字符串对象,会在常量池中生成一个对堆中“str01”的引用,在进行字面量赋值的时候常量池已经存在,直接返回引用即可,str1和str2都是指向堆中的字符串!!返回true!

调换位置后,返回false, 在进行字面量赋值的时候,常量池中不存在字符串对象,所以会在常量池中生成该字符串对象,str1指向常量池中的位置,而str2指向堆中的位置,进行intern方法时,对str1和str2没有任何影响了!


网友评论