一、JDK8后HashMap的底层原理 1、HashMap的底层基于哈希表实现的,JDK8后哈希表的底层是:数组+链表+红黑树。 二、简谈put方法的过程 1、用无参构造器创建HashMap对象的时候,JDK8之后,系统不会自动创建数组为成员变量table赋值。 2、hashmap在存储键值对数据时;会先判断存储节点的数组table是否为null,如果为null,就进行扩容,生成一个长度16位的数组为table赋值。 3、接下来,先将键值对数据的键值进行hashcode运算,后使用hashcode值除以数组的长度取余,算出它放在数组上的索引i;对table[i]进行判断,如果table[i]为null,直接把数据存上去 4、如果table[i]不为null,要判断新增的数据是否跟table[i]上的数据相同(用equals方法比较哈希值),如果相同,进行数据的覆盖。 5、如果不相同,要判断table[i]上是否有红黑树,如果有红黑树,直接在树中插入键值对。 6、如果tab[i]上没有红黑树,那就要判断是否是链表结构;所以要遍历链表。 7、 如果tab[i]上的数据节点没有指向下一个数据,那么代表链表上没有数据,直接将put进来的数据放到链表上 8、如果tab[i]上的数据节点有指向另外的数据,那么就要在遍历过程中看看链表上的数据会不会跟pui进来的数据相同同,如果相同,就进行覆盖。 9,遍历过程中得到链表的长度如果大于8,那么就会调用treeifyBin方法;在方法里判断数组table的长度是否达到最大值64。 9.1、如果不是,就会将进行扩容 9.2、 如果是,就会将链表转成红黑树