
源码
crazyK.
代码小白
展开
-
HashMap仿写
该map中只实现了简单的put()、get()、resize()方法代码已经上传至gitee:HashMap: HashMap仿写部分代码展示:对节点的处理public class Node<K,V> { K key;//key V value;//value int hash;//哈希值 Node<K,V> next;//防止哈希冲突的next节点 public Node(K key, V value, int hash,原创 2022-04-28 15:59:13 · 763 阅读 · 0 评论 -
HashMap中红黑树扩容split()
HashMap中红黑树的扩容和链表的扩容相似,都是拉高低链表,拆分链表扩容的源码解读见:HashMap扩容操作resize(链表扩容)上源码final void split(HashMap<K,V> map, Node<K,V>[] tab, int index, int bit) { TreeNode<K,V> b = this; // Relink into lo and hi lists, preserv原创 2022-04-26 16:51:31 · 1082 阅读 · 0 评论 -
HashMap扩容操作resize
什么情况下会进行resize()操作1.HashMap初始化之后第一次put元素2.HashMap中元素数量达到阈值注意:在对链表进行拆分的时候,会分为两个链表,因为数组扩容后长度是原来的二倍,元素在数组中下标的计算方式为:元素的hash值对数组的长度-1做与操作,数组长度发生变化,元素在数组中下标位置也可能发生变化上源码 final Node<K,V>[] resize() { Node<K,V>[] oldTab = table;原创 2022-04-26 15:19:29 · 1479 阅读 · 0 评论 -
HashMap中put方法(jdk8)
一、put方法流程首先看一下网上一个不错的流程图1.先判断数组是否为空,如果为空则对数组进行resize()扩容2.然后把插入元素的哈希值和数组长度进行与操作,如果table[i] == null,则直接将元素插入到数组对应位置中,否则进行33.判断当前元素的key在数组中是否存在(通过hash并equals方法判断),然后判断节点类型,如果是红黑树,则走4;如果是链表,则走54.如果节点类型为红黑树,则执行红黑树插入操...原创 2022-04-26 10:01:46 · 3365 阅读 · 0 评论