Java HashMap工作原理及实现
来源:互联网 发布:澳洲绵羊油 知乎 编辑:程序博客网 时间:2024/06/16 13:38
转自《Yikun》
转载自《挚爱左岸》
两处出处都都有详细说明工作原理及实现
总结
什么时候会使用HashMap?他有什么特点?
是基于Map接口的实现,存储键值对时,它可以接收null的键值,是非同步的,HashMap存储着Entry(hash, key, value, next)对象。你知道HashMap的工作原理吗?
通过hash的方法,通过put和get存储和获取对象。存储对象时,我们将K/V传给put方法时,它调用hashCode计算hash从而得到bucket位置,进一步存储,HashMap会根据当前bucket的占用情况自动调整容量(超过Load Facotr则resize为原来的2倍)。获取对象时,我们将K传给get,它调用hashCode计算hash从而得到bucket位置,并进一步调用equals()方法确定键值对。如果发生碰撞的时候,Hashmap通过链表将产生碰撞冲突的元素组织起来,在Java 8中,如果一个bucket中碰撞冲突的元素超过某个限制(默认是8),则使用红黑树来替换链表,从而提高速度。你知道get和put的原理吗?equals()和hashCode()的都有什么作用?
通过对key的hashCode()进行hashing,并计算下标( n-1 & hash),从而获得buckets的位置。如果产生碰撞,则利用key.equals()方法去链表或树中去查找对应的节点你知道hash的实现吗?为什么要这样实现?
在Java 1.8的实现中,是通过hashCode()的高16位异或低16位实现的:(h = k.hashCode()) ^ (h >>> 16),主要是从速度、功效、质量来考虑的,这么做可以在bucket的n比较小的时候,也能保证考虑到高低bit都参与到hash的计算中,同时不会有太大的开销。如果HashMap的大小超过了负载因子(load factor)定义的容量,怎么办?
如果超过了负载因子(默认0.75),则会重新resize一个原来长度两倍的HashMap,并且重新调用hash方法。
关于Java集合的小抄中是这样描述的:
以Entry[]数组实现的哈希桶数组,用Key的哈希值取模桶数组的大小可得到数组下标。
插入元素时,如果两条Key落在同一个桶(比如哈希值1和17取模16后都属于第一个哈希桶),Entry用一个next属性实现多个Entry以单向链表存放,后入桶的Entry将next指向桶当前的Entry。
查找哈希值为17的key时,先定位到第一个哈希桶,然后以链表遍历桶里所有元素,逐个比较其key值。
当Entry数量达到桶数量的75%时(很多文章说使用的桶数量达到了75%,但看代码不是),会成倍扩容桶数组,并重新分配所有原来的Entry,所以这里也最好有个预估值。
取模用位运算(hash & (arrayLength-1))会比较快,所以数组的大小永远是2的N次方, 你随便给一个初始值比如17会转为32。默认第一次放入元素时的初始值是16。
iterator()时顺着哈希桶数组来遍历,看起来是个乱序。
在JDK8里,新增默认为8的閥值,当一个桶里的Entry超过閥值,就不以单向链表而以红黑树来存放以加快Key的查找速度。
- Java HashMap工作原理及实现
- Java HashMap工作原理及实现
- Java HashMap工作原理及实现
- Java HashMap工作原理及实现
- Java HashMap工作原理及实现
- Java HashMap工作原理及实现
- Java HashMap工作原理及实现
- Java HashMap工作原理及实现(一)
- Java HashMap工作原理及实现(二)
- Java HashMap工作原理及实现
- Java HashMap工作原理及实现
- Java HashMap工作原理及实现
- Java HashMap工作原理及实现
- Java HashMap工作原理及实现
- Java HashMap工作原理及实现
- 【转载】Java HashMap工作原理及实现
- Java HashMap工作原理及实现
- Java HashMap工作原理及实现
- pandas常见的时间处理函数
- SQL中的Case when
- c++常见问题
- MySQL 学习教程(十一)【整理】-子查询
- 欢迎使用CSDN-markdown编辑器
- Java HashMap工作原理及实现
- 测试
- 链表,顺序表的逆置
- JSP 四大作用域:
- 输出数字方阵
- Leetcode 213
- python类的重写、私有变量
- HTC View 手柄操作简介
- 知识图谱相关会议之观后感分享与学习总结