Hashtable低层的数据结构为数组和单链表,它使用除留余数法确定下标,使用拉链法解决哈希冲突,不允许任何记录的键或者值为null。
存储结构
- 数组
1 | private transient Entry<?,?>[] table; |
- 单链表
1 | private static class Entry<K,V> implements Map.Entry<K,V> { |
构造方法
Hashtable默认的初始容量为11,负载因子与HashMap相同,均为0.75。
1 | public Hashtable(int initialCapacity, float loadFactor) { |
插入操作
在Hashtable中,键和值都不能为null。否则,将抛出NullPointerException。
0x7FFFFFFF=2^31-1,即int类型的最大值(首位为符号位)。
当键的哈希码hash为正数时,hash & 0x7FFFFFFF = hash;
当键的哈希码hash为负数时,hash & 0x7FFFFFFF = -hash。
因此,hash & 0x7FFFFFFF的目的在于将hash转换为正数。
1 | public synchronized V put(K key, V value) { |
addEntry方法采用头插法,实现了Hashtable中的插入操作。
1 | private void addEntry(int hash, K key, V value, int index) { |
扩容操作
扩容后的大小为原来容量的2倍+1。
1 | "unchecked") ( |
按键取值
在按键取值操作中,若给定的key为null,将抛出NullPointerException。
1 | "unchecked") ( |
删除操作
1 | public synchronized V remove(Object key) { |