string学习

来自: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,编译器就帮你创了新对象,自然内存不一样

原文地址:https://www.cnblogs.com/vhyc/p/9220948.html