一.HashMap的基本结构
HashMap在jdk1.8之前采用的是数组+链表的格式.在jdk1.8之后采用的是数组+链表+红黑树
为什么采用数组加链表的格式?
我们知道HashMap的元素是一个个的键值对entry格式,就是一种哈希表结构,在不考虑哈希冲突的情况下,仅仅一次定位就可以完成添加,删除,查找等操作,时间复杂度为O(1),因为哈希表的主干就是数组.
哈希冲突: 如果两个不同元素通过哈希函数得出实际存储地址相同,就说明出现了哈希冲突.
解决哈希冲突的方法:
- 开放地址法(发生冲突,继续查找下一块未被占用的存储地址)
- 再散列函数法
- 链地址法(HashMap采用的方法)
jdk1.8之前的HashMap结构如图一所示,所以说HashMap主体是一个哈希数组,数组的每个元素都是一个单链表的头结点,链表是用来解决哈希冲突的,如果不同的key映射到同一个存储位置就把它放入链表中,所以当冲突的key太多时,通过key在链表查找的效率较低,时间复杂度为O(n)
jdk1.8的HashMap结构如图二所示,jdk1.8的HashMap在数组的同一存储元素节点数不小于8时的存储结构,不再采用单链表形式存储,而是采用红黑树.
总结: HashMap为了解决哈希冲突而采用这种基本结构,查找效率随着链表的复杂而变慢,所以要提高查找效率,要尽可能的减少哈希冲突.