这是我参与8月更文挑战的第7天,活动详情查看:8月更文挑战
散列表
也叫哈希表 ,根据键(Key)而直接访问在内存存储位置的数据结构 ;
通过计算一个关于键值的函数,将所需查询的数据映射到表中一个位置来访问记录,这加快了查找速度
Java中的HashMap,就是基于哈希表实现
优点
1、不论哈希表中有多少数据,查找、插入、删除(有时包括删除)只需要接近常量的时间即0(1)的时间级。实际上,这只需要几条机器指令。
2、哈希表运算得非常快,在计算机程序中,如果需要在一秒种内查找上千条记录通常使用哈希表(例如拼写检查器)哈希表的速度明显比树快,树的操作通常需要O(N)的时间级。哈希表不仅速度快,编程实现也相对容易。
3、如果不需要有序遍历数据,并且可以提前预测数据量的大小。那么哈希表在速度和易用性方面是无与伦比的。
缺点
它是基于数组的,数组创建后难于扩展,某些哈希表被基本填满时,性能下降得非常严重,所以程序员必须要清楚表中将要存储多少数据(或者准备好定期地把数据转移到更大的哈希表中,这是个费时的过程)。
内部结构
以Java的HashMap为例
底层是数组+链表(Java8 + 红黑树)进行存储数据的。
哈希冲突
Key进行hash运算获取底层数组索引时,可能获取的值是相同的,这样就造成了哈希冲突; 这样就需要解决这样的冲突,就引入了链表存储。数组中的值都是一个链表的头结点,当出现哈希冲突时,在对应的位置添加到对应的链表中,当链表长度超过8时,将转换成红黑树存储。