我们知道,HashMap和HashTable都是基于哈希表完成的,那我们首先来回顾哈希表的知识。
哈希表
散列表(Hash table,也叫哈希表),是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。
给定表M,存在函数f(key),对任意给定的关键字值key,代入函数后若能得到包含该关键字的记录在表中的地址,则称表M为哈希(Hash)表,函数f(key)为哈希(Hash) 函数。
许多缓存技术(比如memcached)的核心其实就是在内存中维护一张大的哈希表。
数据的物理存储结构:顺序存储 + 链式存储
我们先大概了解下其他数据结构在增、删、查等基础操作执行性能。
数据结构 | 增 | 删 | 查 |
---|---|---|---|
数组 | 采用一段连续的存储单元来存储数据 | 一般的插入删除操作,涉及到数组元素的移动,其平均复杂度也为O(n) | (1)指定下标的查找,时间复杂度为O(1) (2)给定值进行查找,需要遍历数组,逐一比对给定关键字和数组元素,时间复杂度为O(n) (3)有序数组,则可采用二分查找,时间复杂度提高为O(logn) |
线性链表 | 找到指定位置,处理结点间的引用,时间复杂度为O(1) | 遍历链表逐一比对,复杂度为O(n) | 找到指定位置,处理结点间的引用,时间复杂度为O(1) |
二叉树 | 一棵相对平衡的有序二叉树,平均复杂度均为O(logn) | 一棵相对平衡的有序二叉树,平均复杂度均为O(logn) | 一棵相对平衡的有序二叉树,平均复杂度均为O(logn) |
哈希表 | 不考虑哈希冲突,一次定位即可,时间复杂度为O |