欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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 更加均值化