HashMap的put过程以及hashMap的简单介绍
学习HashMap需要先知道HashMap的一些基本知识点,首先HashMap的数据结构:数组+链表+红黑树(JDK1.8之后),HashMap的存取是无序的在一个数组中通过Hash算法把数据存入,HashMap的键和值都是可以为NULL的,但是键位置只能是一个NULL,HashMap是有阈值的也就是说当数组长度大于64,并且值大于8时,就会变成将链表变成红黑树,当红黑树节点 ≤6
时退化为链表。才会将链表转换成红黑树,目的是为了更加高效的查询。
当我们创建HashMap对象的时候,在JDK8之前,就是在构造方法当中创建一个长度为16的Entry[] Table用来存储键值对数据,JDK8以后就不是在HashMap构造方法创建数组了,是在第一次put方法的时候穿件数组,同时创建的是Node[] table,底层实现上还是Entry数组。
当我们使用HashMap的put的时候,可能会出现下面的操作。
当我们哈希碰撞的时候,就会比较内容,底层就会调用key值锁属于类型的equals方法来进行比较它们的value值是否相等,如果想等那么就会取代value1成为value2,假如说不相同,那么就会继续在这个链表上面进行比较,如果都不相同就会出现一个新的节点来进行存储。
注意!
我们来看一下put的时候会经历什么
首先开始的时候先判断是否创建的有Map假如说没有的话就会进行扩容,扩容到原来的二倍,初始为8,当我们进行存入的时候会通过Hash Code计算如果索引为空插入,不是的话就会通过equals方法来比较原来的key与插入的key一样的话直接覆盖,不一样的话,先判断这个数组下面是链表还是红黑树,如果是红黑树直接插入,不是的话开始遍历这个链表,遍历的时候判断链表长度是否大于8,是的话转换成红黑树,然后插入,不是的话链表插入插入之后会对这个数组的大小进行判断,如果键值对达到了临界值就会对HashMap进行扩容,这个临界值(threshold)=容量(capacity)*加载因子(load Factor),也就是已经占用的数组的最大值,扩容依旧是两倍。