1.继承关系:
HashTable继承关系:
public class Hashtable<K,V> extends Dictionary<K,V>
implements Map<K,V>, Cloneable, java.io.Serializable
HashMap继承关系:
public class HashMap<K,V> extends AbstractMap<K,V>
implements Map<K,V>, Cloneable, Serializable
Dictionary抽象类:
public abstract class Dictionary<K,V> {
public Dictionary() {
}
abstract public int size();//获取数据个数
abstract public boolean isEmpty();
abstract public Enumeration<K> keys(); //获取键的集合
abstract public Enumeration<V> elements();//获取值的集合
abstract public V get(Object key);
abstract public V remove(Object key);
}
2.构造函数:
public Hashtable(int initialCapacity, float 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];
threshold = (int)Math.min(initialCapacity * loadFactor, MAX_ARRAY_SIZE + 1);
}
public Hashtable(int initialCapacity) {
this(initialCapacity, 0.75f);
}
public Hashtable() {
this(11, 0.75f);//默认初始容量为11,加载因子为0.75
}
public Hashtable(Map<? extends K, ? extends V> t) {
this(Math.max(2*t.size(), 11), 0.75f);
putAll(t);
}
3.属性信息:
//定义一个Entry类型的table数组
private transient Entry<?,?>[] table;
//统计数据个数,相当于HashMap里的size
private transient int count;
//扩容阈值
private int threshold;
//加载因子
private float loadFactor;
//版本号
private transient int modCount = 0;
4.默认值和默认属性:
默认初始容量为11,加载因子为0.75
5.底层数据结构:
哈希表+链表
6.扩容机制:
扩容阈值threshold:
threshold = (int)Math.min(initialCapacity * loadFactor, MAX_ARRAY_SIZE + 1);
扩容:
int newCapacity = (oldCapacity << 1) + 1;
if (newCapacity - MAX_ARRAY_SIZE > 0) {
if (oldCapacity == MAX_ARRAY_SIZE)
// Keep running with MAX_ARRAY_SIZE buckets
return;
newCapacity = MAX_ARRAY_SIZE;
}
新数组容量等于原数组容量的2倍再加上1
7.HashMap和HashTable的异同点:
相同点:
1.key-value键值对中,key不可以重复,value可以重复
2.HashMap和HashTable都是插入无序的
不同点:
1.HashMap的底层数据结构是哈希表+链表以及是否要转化为红黑树,HashTable则是哈希表+链表
2.HashTable继承自Dictionary类,该类是比较早起的map父类,现推荐使用AbstractMap类
3.HashTable的默认初始值是11,而HashMap的默认初始值为16
4.HashTable是线程安全的(通过在方法上添加synchronized关键字)
5.HashTable中key和value都不能为null
6.HashTable对key的哈希过程和HashMap是不一样的
7.HashTable的扩容按照二倍加一大小扩容