文章目录
一、哈希表(Hash Table)
哈希表,也叫散列表,根据键(Key)而直接访问在内存存储位置的数据结构,通过计算一个关于键值的函数,将所需查询的数据映射到表中一个位置来访问记录,这加快了查找速度
key-value 对,key 不重复
映射函数称做“哈希函数”,存放记录的数组称做“哈希表”或者“散列表”
映射的位置,即为哈希表的下标 Index
哈希表中不可能存储引用数据类型的对象数据,只是存储引用,即存储对象数据的地址
二、工程实践
- 电话号码簿
- 用户信息表
- 缓存(LRU Cache)
- 键值对存储(Redis)
三、Hash Function 哈希函数
散列表设计的关键
关键在于 hash 函数,设计好,冲突较少,能够让数值分散均匀,否则,较为集中,导致单链表太多,效率降低,时间复杂度由 O(1) 变为 O(n)
简单哈希函数
简单的哈希函数,把每一个字符,它的 ASCII 码加在一起,然后再 mod(取模)上一个数,最后的结果是多少就是多少
四、Hash Collisions 哈希冲突
散列表冲突的解决方法:拉链式解决冲突法
五、Java Map 实现
Map 定义
Java 中的 Map 定义为一个接口,接口就是定义一种能力,没有具体代码实现,具体实现交由子类完成
public interface Map<K,V>
常见子类
HashMap、TreeMap、HashTable、ConcurrentHashMap、LinkedHashMap、Properties
HashMap JDK 11 代码结构
public class HashMap<K,V> extends AbstractMap<K,V>
implements Map<K,V>, Cloneable, Serializable {
static class Node<K,V> implements Map.Entry<K,V> {
final int hash;
final K key;
V value;
Node<K,V> next;
......
}
public V put(K key, V value) {
return putVal(hash(key), key, value, false, true);
}
......
}
TreeMap JDK 11 代码结构
public class TreeMap<K,V>
extends AbstractMap<K,V>
implements NavigableMap<K,V>, Cloneable, java.io.Serializable{
private final Comparator<? super K> comparator;
private transient Entry<K,V> root;
......
}
Hashtable JDK 11 代码结构
public class Hashtable<K,V>
extends Dictionary<K,V>
implements