Java中HashMap和Hashtable的区别

问题1:HashMap和Hashtable的区别:

解答:

 Hashtable继承自Dictionary,HashMap继承自AbstractMap,二者都实现了Map接口
Hashtable不允许null key 和null value,而HaspMap允许
HashMap(JDK1.7)使用几乎和Hashtable相同,不过Hashtable是synchronized同步的

HashTable在不指定容量的情况下的默认容量为11,而HashMap为16,Hashtable不要求底层数组的容量一定要为2的整数次幂,而HashMap则要求一定为2的整数次幂。
Hashtable扩容时,将容量变为原来的2倍加1,而HashMap扩容时,将容量变为原来的2倍。
Hashtable和HashMap它们两个内部实现方式的数组的初始大小和扩容的方式。HashTable中hash数组默认大小是11,增加的方式是 old*2+1

问题2:谈谈HashMap的put方法:

// 新增Entry。将“key-value”插入指定位置,bucketIndex是位置索引。      
void addEntry(int hash, K key, V value, int bucketIndex) {
// 保存“bucketIndex”位置的值到“e”中
Entry<K,V> e = table[bucketIndex];
// 设置“bucketIndex”位置的元素为“新Entry”,
// 设置“e”为“新Entry的下一个节点”
table[bucketIndex] = new Entry<K,V>(hash, key, value, e);
// 若HashMap的实际大小 不小于 “阈值”,则调整HashMap的大小
if (size++ >= threshold)
resize(2 * table.length);
}

在HashMap中组put1操作时会调用到以上方法,现在假如A线程和B线程同时对一个数组位置调用位置addEntry,两个线程会同时的到现在的头结点,然后A写入新的头结点后,B页写入了新的头结点,那B的写入操作就会覆盖A的写入操作造成A的写入操作丢失。