`
czxiyj
  • 浏览: 9895 次
  • 来自: ...
最近访客 更多访客>>
社区版块
存档分类
最新评论

数据结构与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<< 30;//最大上限 static final float DEFAULT_LOAD_FACTOR = 0.75f;//超过3/4时,容器的容量将会增加一倍+1 这里的格式与Word文档中有较大差异,如果阅读不方便,请下载附件!
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics