文章目录
HashTable概述
HashTable和HashMap的原理是一样的。都是一个哈希表的数据结构。
public class Hashtable<K,V>
extends Dictionary<K,V>
implements Map<K,V>, Cloneable, java.io.Serializable
HashTable同样是Map接口下的一员,它还继承了Dictionary这个类。这个是一个任何字典类型的类的抽象父类,里面定义的是字典数据结构的基本必要操作。
HashTable结构
HashTable的结构和HashMap的结构是差不多的。HashTable中没有引进红黑树。所有的冲突Entry都是通过链表保存的。
HashTable原理解析
重要字段
/**
* hash表数组
*/
private transient Entry<?,?>[] table;
/**
* 记录table中保存entry的条数
*/
private transient int count;
/**
* hash表进行rehash的阈值,计算公式是
* capacity * loadFactor)
*
* @serial
*/
private int threshold;
/**
* 负载因子
*
* @serial
*/
private float loadFactor;
/**
* 实现fast-fail机制
*/
private transient int modCount = 0;
/** use serialVersionUID from JDK 1.0.2 for interoperability */
private static final long serialVersionUID = 1421746759512286392L;
/**
* keySet用于存放容器中的所有key
* values用于存放容器中的所有value
* entrySet以set容器形式存放Entry,一般遍历Hashtable会用到此属性
*/
private transient volatile Set<K> keySet;
private transient volatile Set<Map.Entry<K,V>> entrySet;
private transient volatile Collection<V> values;
基本的字段和HashMap还是差不多的。
构造方法
public Hashtable(int initialCapacity, float loadFactor) {
// 检查initialCapacity、loadFactor参数的合法性
if (initialCapacity < 0)
throw new IllegalArgumentException("Illegal Capacity: "+ initialCapacity);
if (loadFactor <= 0 || Float.isNaN(loadFactor))
throw new IllegalArgumentException("Illegal Load: "+loadFactor);
// 忙活了半天不能初始化空的容器吧。。。
if (initialCapacity==0)
initialCapacity = 1;
this.loadFactor = loadFactor;
table = new Entry<?,?>[initialCapacity];
// 计算容器可存放的key-value数量阈值,容量 * 负载因子
threshold = (int)Math.min(initialCapacity * loadFactor, MAX_ARRAY_SIZE + 1)