String,hashCode

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值