文章插图
该方法主要完成两个功能,一个是添加新的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个值得时候满足以上两个条件,才会发生扩容;
- 3 SQL笔记——MySQL数据类型(超详细且易理解)
- 除了加锁,Hashtable和HashMap还有不同吗?
- ConcurrentHashMap 重点成员变量
- 算法介绍及实现——卡尔曼滤波
- 如何保证 HashMap 线程安全
- 源码解析 HashMap底层实现和原理
- 面试收藏!!! HashMap底层原理剖析
- 5. HashMap如何降低Hash冲突概率
- java--HashMap数据结构
- 100个python算法超详细讲解:阿姆斯特朗数