java集合之Hashtable
一、构造方法
1.public Hashtable()
public Hashtable() {
this(11, 0.75f);
}
无参构造,初始化一个容量为11,负载因子为0.75的Hashtable
2.public Hashtable(int initialCapacity)
public Hashtable(int initialCapacity) {
this(initialCapacity, 0.75f);
}
初始化一个容量为initialCapacity,负载因子为0.75的Hashtable
3.public Hashtable(int initialCapacity, float loadFactor)
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);
}
初始化一个容量为initialCapacity,负载因子为loadFactor的Hashtable
4.public Hashtable(Map<? extends K, ? extends V> t)
public Hashtable(Map<? extends K, ? extends V> t) {
this(Math.max(2*t.size(), 11), 0.75f);
putAll(t);
}
初始化一个和参数Map有相同mappings的Hashtable,并将对象t中的所有键值对象拷贝到Hashtable。
二、Hashtable中的数据结构
Hashtable中的数据组的织结构为:hash表+链表,采用拉链法处理hash冲突。
大致呢是这个样子

三、Hashtable中的负载因子
如果没有指定集合的大小,那么Hashtable将默认容量为11,如果指定容量大小,那么集合的大小就是指定的大小(从第三个有参构造中也可以看出),这个和HashMap有很大区别,HashMap的容量必须是2的次幂。而Hashtable中的默认的负载因子和HashMap相同都是0.75。
四、Hashtable为什么是线程安全的
从源码中可以看出,无论是get方法,还是put方法,或是remove方法等,方法上都加了synchronized关键字,所以它能保证多线程下的安全性,但是它的性能和效率也是非常底下的,所以Hashtable基本上被弃用了,因为有同样线程安全,并且高效的ConcurrentHashMap将其代替。
Hashtable还有一个特点就是key和value都不能为null这一点再源码中可以得到体现
public synchronized V put(K key, V value) {
// Make sure the value is not null
if (value == null) {
throw new NullPointerException();
}
// Makes sure the key is not already in the hashtable.
Entry<?,?> tab[] = table;
int hash = key.hashCode();
int index = (hash & 0x7FFFFFFF) % tab.length;
@SuppressWarnings("unchecked")
Entry<K,V> entry = (Entry<K,V>)tab[index];
for(; entry != null ; entry = entry.next) {
if ((entry.hash == hash) && entry.key.equals(key)) {
V old = entry.value;
entry.value = value;
return old;
}
}
addEntry(hash, key, value, index);
return null;
}