HashMap中put与get的实现

来源:互联网 发布:纹绣师上门软件 编辑:程序博客网 时间:2024/04/30 22:20

      java容器中,Map是用来存储键值对的,Map是一个接口,java为他实现了好几种实现,有HashMap、LinkedHashMap、TreeMap、WeakHashMap等,一般情况下,HashMap是最常用的,因为他的存取速度最快,这和他存取的方法有关。下面我们来看看HashMap是如何实现快速存取的。

       下面是《thinkinjava》中关于Map的一个实现:

这个实现用list来分别存储键和值,这个实现虽然简单,但不是一个恰当的实现,因为他创建了键和值的副本,而且在查询键值时,用的是list的方法,只能进行简单的线性查询,速度较慢。

      HashMap的解决方案就是用散列来实现键和值的存取。散列将键保存在某处,以便能够很快找到。而存储一组元素最快的数据结构是数组,所以用他来表示键的信息。数组并不保存键的值,而是保存键的信息,注意,这里是散列的关键。

     我们通过键对象生成一个数字,将其作为数组的下标,这个数就是散列码,由定义在Object中的、且可能由你的类覆盖的hashcode()方法生成。为了解决数组容量被固定的问题,不同的键可以产生相同的下标,也就是可以有冲突。因此,数组多大就不太重要了了,任何键总能在数组中找到他的位置。

    于是,查询一个值的过程首先就是计算散列码,然后使用散列码查询数组,这样我们就不是线性查询数组,而是快速的跳到数组的某个位置,只对少数元素进行比较。这就是HashMap会如此快的原因。

     下面是JDK1.6中HashMap的put和get的实现,我将以注释的形式解释它的编码

原创粉丝点击