来自:http://www.cnblogs.com/kkgreen/archive/2011/08/24/2151450.html
0,new是创了两个对象,一个在堆,一个在常量池
1,变量+字符串=自动变成堆的
2,final变量+字符串=还是常量池
3,final get()+字符串=堆空间变量
4,String a = new String("1") + new String("1"),产生了4个对象,一个“1”常量池,两个“1”堆空间,一个“11”堆空间,没有11常量池现在
5,string使用了一个private , 没有set方法,防止在外部改变,final放在在内部改变,在维护一个数组,保持它的不可变性
6,重写了hashCode函数,从hash值0开始,hash=31 * hash + value[ i ],选31的原因,之所以选择31,是因为它是个奇素数,如果乘数是偶数,并且乘法溢出的话,信息就会丢失,因为与2相乘等价于移位运算。使用素数的好处并不是很明显,但是习惯上都使用素数来计算散列结果。31有个很好的特性,就是用移位和减法来代替乘法,可以得到更好的性能:31*i==(i<<5)-i。现在的VM可以自动完成这种优化。
7,equal方法分析,1,比较是不是同一个引用,2,是不是string对象,3,长度是否相同,4,一个个对比
8,compare方法,1,比较长度,2,一个个对比
包含了intern:https://blog.csdn.net/soonfly/article/details/70147205
文中有点理解不一样,就是java7用了intern不会产生新的常量,还是以前的
intern后相当把引用的地方放进string池,不改变原来对象
但已经有了这个string常量,再intern,两个是不一样的(是错误理解
对编译期的理解:之前强记住为什么是不相等的,原来编译期就为什么处理他们不相等,在都是字面量“aa”和”bb“的时候,编译器会优化到同一个块内存,但用了变量a,编译器就帮你创了新对象,自然内存不一样