String,hashCode
程序员文章站
2024-03-22 17:59:10
...
文章目录
为什么String要设计成不可变的
- 安全,Java中基本类型采用值传递方式,对象对类型采用引用传递.如果String 对象值可以变,系统会带来许多不稳定和不安全。
- 比如HashMap 元素无法插入,数据库连接安全
为什么重写equals方法要重写hashCode
重写equals目的,主要是为了判断是否为同一对象。如果重写对象equals方法,判断对象相等,hashCode不相等。在HashMap,put过程中,会造成重复插入。保证不了唯一性。
hashCode有哪些算法
String hashCode算法
31*h = h<<5-h
int h;
for(int i = 0;i<value.length;i++){
h = 31*h+value[i];
}
之所以使用 31, 是因为他是一个奇素数。如果乘数是偶数,并且乘法溢出的话,信息就会丢失,因为与2相乘等价于移位运算(低位补0)。使用素数的好处并不很明显,但是习惯上使用素数来计算散列结果。 31 有个很好的性能,即用移位和减法来代替乘法,可以得到更好的性能: 31 * i == (i << 5) - i, 现代的 VM 可以自动完成这种优化。这个公式可以很简单的推导出来。
Java是值传递还是引用传递
HashMap 为什么使用 & 与运算代替模运算
//28%16 == 15 & 28
a%b = (b-1) & a b是2的指数倍
10000000 00000000 00000000 00101100
10000000 00000000 00000000 00001111
HashMap hash 算法
public int hash(Object key){
return key==null?0:(h=hashCode())^(h>>>16);
}
对象的hashCode 32位
0000000 01101000 10100101 01011101
避免对象低16 全为0,对象的hashCode 更加均值化
上一篇: for小应用“百钱买百鸡”