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没有任何影响了!
java.lang.String:
_mark: markOop 4字节
_klass: klassOop 4字节
value:char[]------------------------》 typeArrayOopDesc: 在java中数组也是一个对象
offset: int _mark
count: int _klass
hash: int (哈希缓存) _length=3
[0]='h' [1]='e'[2]='l'
这揭示了string对象在内存的本质情况。