HashMap设计及实现原理

1.HashMap的数据结构

这里先来讲一下数组和链表的优缺点。

1.1数组和链表

数组存储区间是连续的,占用内存严重,因此它的空间复杂的很大。但数组的二分查找时间复杂度小,为O(log2n);

其特点是:寻址容易,插入和删除困难

链表存储区间离散,占用内存比较宽松,故空间复杂度很小,但时间复杂度很大,达O(N)。

其特点是:寻址困难,要一个一个遍历,插入和删除容易

1.2HashMap的数据结构

为了设计出更好的兼顾这两者优点的数据结构,HashMap借鉴了数据及链表的数据结构,运用拉链法(hashmap的实现方式之一),拉链法的实现原理图如下:



即HashMap的是由“数组+链表“组成;一个长度为16的数组中,每个元素存储的是一个链表的头结点。那么这些元素是按照什么样的规则存储到数组中呢。一般情况是通过hash(key)%len获得,也就是元素的key的哈希值对数组长度取模得到。比如上述哈希表中,91%16=11,155%16=11,171%16=11,所以91,155,171都存储在数组下标为11的位置。

  HashMap其实也是一个线性的数组实现的,所以可以理解为其存储数据的容器就是一个线性数组。这可能让我们很不解,一个线性的数组怎么实现按键值对来存取数据呢?这里HashMap有做一些处理。

  首先HashMap里面实现一个静态内部类Entry,其重要的属性有 key , value, next,从属性key,value我们就能很明显的看出来Entry就是HashMap键值对实现的一个基础bean,我们上面说到HashMap的基础就是一个线性数组,这个数组就是Entry[],Map里面的内容都保存在Entry[]里面。

/**
     * The table, resized as necessary. Length MUST Always be a power of two.
                    transient是关于序列化的一个关键字,具体实现可以百度,这里不做概述
     */

    transient Entry[] table;


2.关于HashMap的存取实现(put、get操作等)

可以参考http://blog.csdn.net/vking_wang/article/details/14166593

本文参考自它,对其感到错误抑或是不理解的地方,我做了一些修改。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值