在牛客上刷题还有面试遇到就稍微记下:
1.继承上不同:HashMap继承AbstractMap,而HashTable继承Dictionary
HashMap源码:
public class HashMap<K,V> extends AbstractMap<K, V>
implements Map<K,V>, Cloneable,Serializable...
Hashtable源码:
public class Hashtable<K,V>
extends Dictionary<K,V>
implements Map<K,V>, Cloneable, java.io.Serializable{
}
2.执行效率不同:以下是方法的源码
HashMap的put方法源码:
public V put(K key,V value)//没有同步
Hashtable的put方法源码:
public synchronized V put(K key,V value)//当然,Hashtable的其它方法,如get,size,remove等
//都加了synchronized关键字同步操作
3.关于key和value是否等于null问题
HashMap的put方法源码中有如下代码块:
if(key == null)
return putForNullKey(value);//调用某个方法直接把key为null,值为value的键值对插入进去。
Hashtable的put方法源码中有如下代码块:
if(value == null)
{
throw new NullPointerException();
}
//如果value为null会空抛异常
4.有无contains方法
HashMap的方法源码:
public boolean containsKey(Object Key)...//
public boolean containsValue(Object value)...//
//注意,没有contains方法
Hashtable的方法源码:
public synchronized boolean contains(Object value)...//
public synchronized boolean containsKey(Object Key)...//
public synchronized boolean containsValue(Object value)...//
总结:
1.都实现了Map接口。
2.HashMap实现非同步,线程不安全;Hashtable实现同步,线程安全。
3.HashMap没有contains方法,而Hashtable有contains方法。
4.HashMap允许键值对为null(注意:键唯一,值可以多个为null,所以用containsKey()方法判断键,因为get()返回null,既可以表示HashMap没有该键,也可以表示该HashMap的键为null),而Hashtable不允许
5.两个遍历的方式的内部实现不同,HashMap,Hashtable都用了iterator,但Hashtable还用了Enumeration
有毛病请指出,谢谢,后续再更新。。。