HashMap实现原理

HashMap是一个键值对集合,使用hHashMap可以根据key查找到对应的value.

如果不考虑性能等问题,如何实现一个简单的键值对集合,并支持查找:

实现上可以创建两个List(lstKey,lstValue),分别保存key和value,约定两个集合key,value的位置一一对应(即如果在lstKey的第五个位置找到key,则value也在lstValue的第五个位置.)

 map.get(key)方法逻辑:从lstKey集合中找到key所在的位置,然后用此位置就能拿到lstValue中的value.

 map.set(key,value)方法逻辑:从lstKey集合中找到key所在的位置,找不到就在添加到集合尾部,找到就修改lstValue中对应的value.

 可以看到每次查找相当于数据库的全表扫描(借鉴数据库的思路,我们的key存储结构可以仿照索引的b树实现快速定位.)

那么HashMap是怎么实现快速定位的呢

试想如果能从key的值就能推出它存储的位置信息,那不是就不用做全表扫描了吗? position = f(key)

hashCode正是这个用途,key的hashCode和key的存储位置存在一个函数映射关系.这样对key求hashCode后就能直接定位到key的位置信息.

还有一个问题要考虑,如果底层实现是一个数组来存储key,但是数组长度又是固定的,当数据很多时,就会不够用,实现上对数组长度取模,这样就可能一个位置对应了多个key,

所以这个数组不是存实际的key,而是指向一个集合,集合里包括1到多个key,对这个集合再做一次扫描就能找到.

还有就是f(key)的算法要能够保证尽量均匀的分布到数组上,以免浪费空间.

posted @ 2017-03-15 15:38  java林森  阅读(209)  评论(0编辑  收藏  举报