1、HashMap底层原理
HashMap在jdk1.7版本中采用的是数组+链表实现的,而在jdk1.8中则采用数组+链表+红黑树实现的。那么为什么在jdk1.8版本中引入了红黑树呢?在HashMap存值时,如果index发生冲突,则将值存放在链表当中。我们知道,在链表做查询的时候,是需要从头部查询到尾部的,如果链表过长,那么我们的查询效率会非常底。所以在jdk1.8中引入了红黑树,当数组长度>=64,且链表长度>8时,就会把链表转换成红黑树,以提高查询效率。
2、HashMap的时间复杂度
当我们的HashMap存值没有发生index冲突的情况下,我们的复杂度为O(1),在发生冲突时,将冲突的值存入链表时,也就是我们的jdk1.7版本用链表存储时,我的的复杂度为O(n),但在jdk1.8引用了红黑树,当数组长度>=64,且链表长度>8时,就会把链表转换成红黑树,复杂度就为O(logn)。
3、HashMap7发生扩容死循环问题
HashMap本身是非线程安全,不推荐在多线程中去使用。HashMap在jdk1.7使用的是头插法,后在jdk1.8中改为尾插法才解决此问题。如果是在多线程的情况下,推荐使用ConcurrentHashMap。
4、HashMap底层是有序存放的么
HashMap是无序存放的,因为Hash算法是散列计算的没有顺序,如果需要顺序存放可以使用LinkedHashMap,它在HashMap的基础上新引用了一条双向链表来存放。
5、HashMap Key 为null 存放在什么位置
存放在数组index为0的位置。