软件中时间效率是一项衡量软件质量的关键指标,数据读入与查询是软件中做常用的操作。JDK1.8中hashMap是采用hash表存数据,使用hash表能够大大增强数据的查询效率。
hash表:是一个键值对(key,value),通过hash函数能够快速的找到所需的数据,即通过一个函数function(key)计算即可找到数据。
hash函数:hash函数算法属于商业型公司的核心资产,严格保密,一般使用者会用即可。如果hash函数做的特别好,数据散列无冲突,则需计算一次就可以找到相应的数据。
hash冲突:再好的hash函数,也会发生hash冲突。所谓的hash冲突就是根据key值计算出来的数据不是一个,而是两个或两个以上。
JDK1.7解决hash冲突的数据结构:数组+链表,如下图
这时查找数据时,通过哈希函数key值找到第一个数据后,进行比对,如果第一个数据不是所要的数据,沿着链表全局扫描,直到数据匹配为止。
JDK1.8解决hash冲突的数据结构:数组+链表+红黑树。jdk1.7在hash冲突时使用链表来解决冲突,如果要查找的数据在链表的最后一个,加入链表有n个结点,则需要比对n次。jdk1.8对此进行改进,当冲突数据结点小于8个时,使用链表,当大于8个时,则数据结构变为红黑树,因为使用排序树查找时速度要快很多。如下图所示:
为什么要用红黑树 :通过排序树查找数据时,查找的次数和树的高度有关,在排序树中平衡二叉树的高度最低,也就是平衡二叉树查找效率最高,但是维护这个平衡二叉树的算法复杂,如增加一个数据节点,让这个树继续成为平衡二叉树需要做多次指针变换操作。红黑树是研究人员给出来的一种数据结构,这种数据结构类似与平衡二叉树,但不完全是平衡二叉树,它具有平衡二叉树同样的查找性能,同时维护平衡二叉树简单,最多经过三次旋转(结点之间的指针变换)即可完成红黑树的维护,至于为什么最多经过三次旋转即可达到平衡,有严格的数学证明过的。
文中图片来自 https://blog.youkuaiyun.com/zhouxcwork/article/details/81631399