在jdk8中,HashMap是用了数组和链表以及红黑树这三种数据结构数组
首先,在hashmap类中,都有一个table数组,咱们在存储数据时,对这个数据的hash值进行一系列的计算 计算出它在Table中的位置(下标),并将它存放进去
然而,咱们在hashmap是什么 中提到,不一样的对象的Hash值可能相同,那么相同的Hash值会致使不一样的数据在数组中有相同的存储位置,咱们虽然创造了一系列的解决办法,但并不能彻底的避免这种冲突,那么,当产生冲突时,hashmap是怎样解决的呢?
当产生冲突时,如data1和data2 ,咱们把data2放在data1后的列表中,这样就不会由于哈希值的冲突而对数据产生影响。
1.时间复杂度
咱们知道,当某条链表的长度大于8时,就会将其转换为红黑树。遍历一条链表的时间复杂度O(n),当一条链表过长时,遍历这条链表可能会花很长时间,而遍历一颗红黑树的时间复杂度为O(logn),从而减小了插入或查找的时间
2.红黑树
简单总结下红黑树是什么:一种二叉查找树,但在每一个结点上增长一个存储位表示结点的颜色,能够是Red或Black。经过对任何一条从根到叶子的路径上各个结点着色方式的限制,红黑树确保没有一条路径会比其余路径长出俩倍,于是是接近平衡的。数据结构
也就是说,红黑树是一种相对平衡的查找二叉树,这使他不只便于查找,也便于插入和删除,这对于既须要插入也须要查找的HashMap是很是有利的spa
下一节:数据哈希值的计算和在table中的存储位置3d