数据结构与Java集合框架读书笔记---散列类(hash)

了解HashMap原理对于日后的缓存机制多少有些认识。在网络中也有很多方面的帖子,但是很多都是轻描淡写,很少有把握的比较准确的信息,在这里试着不妨说解一二,本文并非原创,对本文有兴趣的读者可以看数据结构和Java集合框架,本文是对其第13章的总结,做了几年的开发,是时候总结一下了。 HashMap实现了Map接口,HashMap主要以键值(key-value)的方式来体现,笼统的说就是采用key值的哈希算法,外加取余最终获取索引,而这个索引可以认定是一种地址,既而把相应的value存储在地址指向内容中。这样说或许比较概念化,也可能复述不够清楚,来看列式更加清晰: int hash=key.hashCode();//------------------------1 int index=hash%table.lenth;//table表示当前对象的长度-----------------------2 其实最终就是这两个式子决定了值得存储位置。但是以上两个表达式还有欠缺。为什么这么说?例如在key.hashCode()后可能存在是一个负整数,你会问:是啊,那这个时候怎么办呢?所以在这里就需要进一步加强改造式子2了,修改后的: int index=(hash&Ox7FFFFFFF)%table.lenth; 到这里又迷惑了,为什么上面是这样的呢?对于先前我们谈到在hash有可能产生负数的情况,这里我们使用当前的hash做一个“与”操作,在这里需要和int最大的值相“与”。这样的话就可以保证数据的统一性,把有符号的数值给“与”掉。而一般这里我们把二进制的数值转换成16进制的就变成了:Ox7FFFFFFF。(注:与操作的方式为,不同为0,相同为1)。 例子: 10000000000000000000010001010111 //比如散列值为-1111 & 01111111111111111111111111111111 //与上int的最大值 00000000000000000000010001010111 //结果去掉了最前面的符号位 而对于hashCode()的方法一般有: public int hashCode(){ int hash=0,offset,len=count; char[] var=value; for(int i=0;i
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值