HashMap原理
文章平均质量分 70
我在深沪海边
这个作者很懒,什么都没留下…
展开
-
HashMap的put方法(JDK1.7)
public V put(K key, V value) { //如果table数组为空,进行数组填充(为table分配实际内存空间),入参为threshold //此时threshold为initCapacity,默认是1<<4(=16) if (table == EMPTY_TABLE) { inflateTable(threshold);//分配数组空间 } //如果存入的键值...原创 2021-08-13 09:03:38 · 752 阅读 · 0 评论 -
JDK1.7及其之前的HashMap死循环问题
只是在jdk1.7以及多线程下进行哈希扩容的情况下才会发生 本质是产生了一个循环链表,导致在get或put新元素的时候一直循环遍历链表 主要发生在hashmap的transfer方法中 //转移原哈希表中的元素到新的哈希表中 void transfer(Entry[] newTable, boolean rehash) { //获取新数组容量 int newCapacity = newTable.length; //遍历老哈希表En原创 2021-08-13 09:08:08 · 188 阅读 · 0 评论 -
为什么HashMap的容量必须是2的次幂
要明白为什么是2的n次幂,这要从hashmap的hash方式说起,hashmap的容量期望就是用来均匀散列存放map中的元素。hashmap根据hash值把元素放到hashmap内部数组的一个位置上。 1、为什么hashmap的容量必须是2的n次幂?? 我们不妨先看看hashCode的原理,以String为列,获取hashCode的方法源码 public int hashCode() { int h = hash; if (h == 0 && v...原创 2021-08-11 17:08:41 · 914 阅读 · 0 评论 -
HashMap(JDK1.7)底层原理(二)
HASHMAP(JDK1.7)在PUT的时候会发生冲突,而解决冲突的方式就是使用链表,那么我们假设HASHMAP存储结构如下图: 那么节点1和节点2组成了一个链表,那么现在如果再来PUT一个节点3,假设节点3也需要插在这个链表中,我们考虑链表的插入效率,将节点3插在链表的头部是最快的,那么就会如下图: 那么按照上图这种插入办法,会出现一个问题: ·当我们需要get(节点2)时,我们先将节点2的key进行哈希然后算出下标,拿到下...原创 2021-08-11 16:29:50 · 71 阅读 · 0 评论 -
HashMap(JDK1.7)底层原理(一)
在JDK1.7中,HashMap是由数组+链表实现的,原理图如下 HashMap map = new HashMap(); // 伪初始化 map.put("键","值"); // 真初始化 HashMap的构造方法在执行时会初始化一个数组table,大小为0 HashMap的put方法在执行时会首先判断table大小是否为0,如果为0则会进行真初始化,也叫延迟初始化,当进行真初始化时,数组的默认大小为16,当然也可以调用HASHMAP的有参构造方法由你来指定一个数组的初...原创 2021-08-11 16:23:43 · 134 阅读 · 0 评论