谈谈HashMap的底层实现原理

yu6810 5月前 ⋅ 78 阅读

HashMap在JDK1.8之前是数组+链表,JDK1.8以后引入了红黑树。 链表转为红黑树需要满足两个条件:1. HashMap的容量大于等于64;2. 链表的节点数量大于等于8. 当调用removeTreeNode方法删除红黑树的节点时后,如果根节点其中一个为空,或者节点个数小于等于6,会调用untreeify方法将红黑树转化为链表。 put方法:先拿到扰动后的hashcode,然后用(n-1)&hash计算下标位置,判断桶是否有值,桶为空直接存入,不为空,则对链表或者红黑树进行遍历,调用equals方法判断是否有相同的key值,有的话,则更新该键值对的值,没有,则将新的键值对添加到链表或红黑树的末尾。如果插入新键值对后,HashMap 的大小超过了阈值(数组长度 * 负载因子),则进行扩容操作。 get方法:先拿到扰动后的hashcode,然后用(n-1)&hash计算下标位置。如果桶位置为空或者桶中第一个元素就是要查找的键,直接返回null或对应的值。如果桶中有链表或者红黑树,遍历链表或红黑树查找对应的键。如果找到键,则返回对应的值。如果遍历完链表或者红黑树仍未找到键,则返回null。 如果在实际开发需求中hashmap有100个元素,需要不扩容,所以要设置合适的初始大小,我设置的是256 遍历hashMap,用EntrySet不用KeySet.因为EntrySet直接获取到键值对,而KeySet只能获取到键


全部评论: 0

    我有话说: