使用java绕不开的HashMap,但面试中经常会问到HashMap和HashTable有什么区别,该如何回答?
1.HashMap非同步而HashTable是同步的
因此如果不涉及到多线程并发问题,就是用HashMap,那涉及到多线程并发问题就用到HashTable了吗?很抱歉,也轮不到它,可以用ConcurrentHashMap来代替HashMap。
2.HashMap允许一个null键或者多个null值
HashTable不允许null键或者null值,值得注意的是ConcurrentHashMap也不允许出现null键或者null值。
3.HashTable是一个遗留的类
HashTable是JDK1.0中引入的,HashMap是在JDK1.2中引入的。
4.HashTable要慢与HashMap
由于HashTable在所有主要方法上加了同步,
public synchronized V get(Object key)
因此HashTable在访问速度上慢与HashMap。
5.在HashMap迭代时进行修改将抛出ConncurrentModificationException
在对HashMap进行迭代并同时修改HashMap,将会抛出ConncurrentModificationException
public final void forEach(Consumer<? super Map.Entry<K,V>> action) {
Node<K,V>[] tab;
if (action == null)
throw new NullPointerException();
if (size > 0 && (tab = table) != null) {
int mc = modCount;
for (int i = 0; i < tab.length; ++i) {
for (Node<K,V> e = tab[i]; e != null; e = e.next)
action.accept(e);
}
if (modCount != mc)
throw new ConcurrentModificationException();
}
}