HashMap的实现原理

hashmap的含义

HashMap实现了Map接口,Map接口对键值对进行映射。Map中不允许重复的键。Map接口有两个基本的实现,HashMap和TreeMap。TreeMap保存了对象的排列次序,而HashMap则不能。HashMap允许键和值为null。HashMap是非synchronized的,但collection框架提供方法能保证HashMap synchronized,这样多个线程同时访问HashMap时,能保证只有一个线程更改Map。

hashmap的数据结构

hashmap出现于JDK1.2中,为map接口的实现类,底层通过拉链法来实现散列表,以达到存储数据的目的,散列表为数组+链表的结构,技术组上每个元素都是一条链表。

而之所以采用散列表的结构是因为:数组因为其地址连续,查找和修改元素效率高,时间复杂度为0(1),但其增加和删除元素效率低下,因为有可能会引发一半以上的数据偏移,平均时间复杂度为0(n),且因为地址连续,占用内存严重。

链表的优点为存储区间离散,内存占用宽松,且插入和删除其实只是地址间的相互拷贝,时间复杂度为0(1),但其查找一个元素往往需要遍历整条链表,时间复杂度为0(n)。

散列表就是综合了数组与链表优点的产物,平衡了两者的性能,是数据的增删和查询都有了较好的效率。

hashmap中的红黑树

如果某个桶中的记录过大的话(当前是TREEIFY_THRESHOLD = 8),HashMap会动态的使用一个专门的treemap实现来替换掉它。这样做的结果会更好,是O(logn),而不是糟糕的O(n)。

        它是如何工作的?前面产生冲突的那些KEY对应的记录只是简单的追加到一个链表后面,这些记录只能通过遍历来进行查找。但是超过这个阈值后HashMap开始将列表升级成一个二叉树,使用哈希值作为树的分支变量,如果两个哈希值不等,但指向同一个桶的话,较大的那个会插入到右子树里。如果哈希值相等,HashMap希望key值最好是实现了Comparable接口的,这样它可以按照顺序来进行插入。这对HashMap的key来说并不是必须的,不过如果实现了当然最好。如果没有实现这个接口,在出现严重的哈希碰撞的时候,你就并别指望能获得性能提升了。
————————————————
版权声明:本文为CSDN博主「tuke_tuke」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/tuke_tuke/article/details/51588156

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值