详细介绍 HashMap底层原理( 二 )


文章插图
该方法主要完成两个功能,一个是添加新的key到Entry数组中,第二个就是对于不同的key的hash值相同的情况下,在同一个数组下标出,构建单向链表进行存储;
源码如下:
碰撞以及解决方法(开放定址法,在哈希法,链地址法,建立一个公共溢出区)
当两个对象的相同时,他们的位置相同,hash碰撞就会发生 。因为使用存储对象,这个Entry(存储键值对的Map.Entry对象)会存储在中 。这两个对象算相同,但是他们可能并不相等 。那么如何获取这两个对象的值呢?当我们调用get()方法,会使用键值对象的找到位置,遍历一直找到值对象 。找到位置以后,会调用keys.()方法去找到中正确的节点,最终找到要找的值对象,使用final修饰,并采用合适的()和()方法,减少碰撞 。
扩容机制
扩容必须满足两个条件
【详细介绍HashMap底层原理】在添加值的时候,它默认能存储16个键值对,直到你使用这个时,它才会给分配16个键值对的存储空间,(负载因子为0.75,阈值为12),当16个键值对已经存储满了,我们在添加第17个键值对的时候才会发生扩容现象,因为前16个值,每个值在底层数组中分别占据一个位置,并没有发生hash碰撞 。也有可能存储更多的键值对,最多可以存储26个键值对,我们来算一下:存储的前11个值全部发生hash碰撞,存到数组的同一个位置中,(这时元素个数小于阈值12,不会扩容),之后存入15个值全部分散到数组剩下的15个位置中,(这时元素个数大于等于阈值,但是每次存入元素并没有发生hash碰撞,不会扩容),11+15=26,当我们存入第27个值得时候满足以上两个条件,才会发生扩容;