HashMap知识点汇集

简介: HashMap知识点总结

1、HashMap实现的是Map接口,与ArrayList不一样,与Hashtable、LinkedHashMap一样

2、HashMap只允许一个key为null,如果有两个和正常的key冲突一样处理,HashMap非线程安全,可能会出现死锁等,多线程里使用的话可以用ConcurrentHashMap代替。

3、HashMap类似,不同的是它承自Dictionary类,线程安全,但是项目里面不会用,非多线程环境不如HashMap,多线程环境可以使用ConcurrentHashMap,因为ConcurrentHashMap使用分段锁,所以性能比HashTable好,ConcurrentHashMap后面会详细说。

4、HashMap的构成是数组+链表(链地址法),新增一个Entry是通过一个Entry的key的hashcode再通过HashMap的hash算法(高位运算)和取模得到数组的位置,添加到链表的尾部。当然Hash算法计算结果越分散均匀,Hash碰撞的概率就越小,map的存取效率就会越高,当然数组的长度越大,Hash碰撞的概率就小,反之即使Hash很均匀,也会出现大量的Hash碰撞,解决方案就是好的Hash算法,以及扩容机制。
HashMap默认初始大小16(一般来说hash表的大小最好为素数,一般来说素数导致冲突的概率要小于合数,而hashmap中的hash表大小为2的N次方,是一个合数(这个是计算过后的,不是你传值多少初始大小就是多少)。HashMap采用这种非常规的设计,主要是为了在取模和扩容的时候做优化,同时为了减少冲突,HashMap定位hash桶索引的时候,也加入了高位参与运算的过程),负载因子0.75,0.75为综合考虑空间和时间的因素,建议不要改,如果想提高查询速度,可减小该值,如果想节省空间,可增大该值,负载因子可大于1,不过越大后期出现的hash碰撞会更多。在0.75的负载因子下,一般size <= threshold = table.length * loadFactor,也就是说元素数量肯定会小于哈希桶的长度,牺牲了空间提高时间效率。jdk1.8里新增了红黑树部分,当链表长度大于8时转化为红黑树,查询效率更高,时间复杂度有O(n)到O(logn)。简单数据类型的封装类hash散列还是均匀分布的,对于自定义Object,如果hashcode的方法不好的话容易造成分布不均匀。
HashMap是通过key的hashcode方法进行hash算法那后取模计算key对应的数组位置,找到对应的链表,再通过==或者equal()来判定二个key是否相等 。
参考一下美团团队的图:
参考一下美团团队的图

5、HashMap线程不安全,会产生死锁的原因简单点就是resize的时候一个线程里扩容后一个keya的next为另一个keyb,而另一个keyb在扩容的时候由于发现自己的next就是那一个keya,这时候陷入死循环。jdk1.7里resize的时候会导致链表顺序倒过来,而1.8不会。1.8虽然不会因为顺序倒置而有死循环的问题,但是在并发的情况还是有可能有数据丢失的问题,这时候还是要用ConcurrentHashMap。
图文介绍可参考
HashMap死锁图文解释

6、HashSet是基于HashMap来实现的,HashSet里元素也是无序的

7、ArrayList集合是初始化容量为10,每次扩容后为1.5倍

8、Hashmap为什么大小是2的幂次。因为HashMap的采用高位运算

9、有序HashMap:LinkedHashMap,实现原理是HashMap+LinkedList,HashMap的数组链表+Entry之间的双向链表。

目录
相关文章
|
7月前
|
存储 安全 Java
【面试知识点】一文带你深入了解HashMap
【面试知识点】一文带你深入了解HashMap
什么啊?面试官还在问HashMap了,老知识点了啊
不就是一个hash加一个map嘛,多简单啊? 答:利用key的hashCode重新hash计算出当前对象的元素在数组中的下标,存储到数组里面就行了,底层就是数组嘛! 然后面试官说了句:好的,我知道了,回去听消息吧!
掌握4个HashMap核心知识点,你可以轻松玩转红黑树!
本文咱们了解一下红黑树的设计,相比 jdk1.7 的 HashMap 而言,jdk1.8 最重要的就是引入了红黑树的设计,当冲突的链表长度超过 8 个的时候,链表结构就会转为红黑树结构。
104 0
|
存储 算法 安全
一万三千字的HashMap面试逼问知识点详解
HashMap 是无论在工作还是面试中都非常常见常考的数据结构。比如 Leetcode 第一题 Two Sum 的某种变种的最优解就是需要用到 HashMap 的,高频考题 LRU Cache 是需要用到 LinkedHashMap 的。HashMap 用起来很简单,所以今天我们来从源码的角度梳理一下Hashmap
172 0
一万三千字的HashMap面试逼问知识点详解
|
存储 Java 索引
每天一个知识点(四)说一下 HashMap 的实现原理?
HashMap底层是一个哈希表,以数组加链表的形式存储值。HashMap具有以下特点: 1.HashMap允许key和value为空 2.HashMap是线程不安全的 3.HashMap的初始容量为16,负载因子大小为0.75 4.在jdk7.0中,底层是数组加链表;在jdk8.0中,底层是数组加链表加红黑树
|
2月前
|
Java
让星星⭐月亮告诉你,HashMap中保证红黑树根节点一定是对应链表头节点moveRootToFront()方法源码解读
当红黑树的根节点不是其对应链表的头节点时,通过调整指针的方式将其移动至链表头部。具体步骤包括:从链表中移除根节点,更新根节点及其前后节点的指针,确保根节点成为新的头节点,并保持链表结构的完整性。此过程在Java的`HashMap$TreeNode.moveRootToFront()`方法中实现,确保了高效的数据访问与管理。
30 2
|
2月前
|
Java 索引
让星星⭐月亮告诉你,HashMap之往红黑树添加元素-putTreeVal方法源码解读
本文详细解析了Java `HashMap` 中 `putTreeVal` 方法的源码,该方法用于在红黑树中添加元素。当数组索引位置已存在红黑树类型的元素时,会调用此方法。具体步骤包括:从根节点开始遍历红黑树,找到合适位置插入新元素,调整节点指针,保持红黑树平衡,并确保根节点是链表头节点。通过源码解析,帮助读者深入理解 `HashMap` 的内部实现机制。
35 2