时间复杂度:O(1)
1.为什么要用散列表
数组:寻址容易,插入和删除困难
链表:寻址困难,插入和删除容易
散列表:折中,又叫哈希表
2.什么是散列表
通过KEY能直接找到表中记录,加快查找速度。
把KEY映射到一个地址来访问的技术就是散列函数
散列函数,给定任意长度计算出来结果都是固定长度,不同的消息不同的结果
总结:给定表M ,存在函数f(key),带入函数后能得到包含该关键字记录在表中的地址,
则成表M为Hash表,函数f(key)为哈希函数
3.散列表的优点
根据KEY找VALUE,性能最好的算法,无论多大数据量一次性找到
散列表中散列数组的大小称为容量,容量称为加载因子,小于75%会扩容
HASHMAP可以设置初始容量,初始是16,默认加载因子是75%
扩容时,会影响PUT的性能
4.JAVA MAP的实现
HASHMAP 散列实现
LINKEDHASHMAP 链表实现
TREEMPA 红黑树
5.散列函数实现原理
将KEY转换成一个散列码的整数值byte short int char转换成int
压缩散列码
假设散列表的索引0-(n-1)
h(hashcode)=hashcode%N
哈希表hashtable(key,value) 就是把Key通过一个固定的算法函数既所谓的哈希函数转换成一个整型数字,然后就将该数字对数组长度进行取余,取余结果就当作数组的下标,将value存储在以该数字为下标的数组空间里。(或者:把任意长度的输入(又叫做预映射, pre-image),通过散列算法,变换成固定长度的输出,该输出就是散列值。这种转换是一种压缩映射,也就是,散列值的空间通常远小于输入的空间,不同的输入可能会散列成相同的输出,而不可能从散列值来唯一的确定输入值。简单的说就是一种将任意长度的消息压缩到某一固定长度的消息摘要的函数。)
而当使用哈希表进行查询的时候,就是再次使用哈希函数将key转换为对应的数组下标,并定位到该空间获取value,如此一来,就可以充分利用到数组的定位性能进行数据定位。
原理讲解:https://blog.csdn.net/wangshuminjava/article/details/82682896