关于 HashMap 和 Hashtable 之间的不同?网上有大批的网友在讨论,而在我看来,他们都没有Stackoverflow上一位网友总结的全面。因此在这里摘录一下,方面自己加深理解!
链表的存储结构
HashMap的存储结构
从上面的两张图中已能看出它们的不同。下面我们看看非多线程应用中使用哪个更有效率?
Java 中 HashMap 和 HashTable 的不同点
- Hashtable 是同步的,然而 HashMap不是。 这使得HashMap更适合非多线程应用,因为非同步对象通常执行效率优于同步对象。
- Hashtable 不允许 null 值和键。HashMap允许有一个 null 键和人一个 NULL 值。
- HashMap的一个子类是LinkedHashMap。所以,如果想预知迭代顺序(默认的插入顺序),只需将HashMap转换成一个LinkedHashMap。用Hashtable就不会这么简单。
-
HashMap 和 HashTable 继承的类不一样
public class Hashtable<K,V> extends Dictionary<K,V> implements Map<K,V>, Cloneable, java.io.Serializable public class HashMap<K,V> extends AbstractMap<K,V> implements Map<K,V>, Cloneable, Serializable
- 同步机制不一样。HashMap没有提供同步机制,是线程不安全的,需要自己在外面写同步代码,HashTable 部分方法上有自己的 synchronize 同步,是线程安全的。
- HashMap中没有contains()方法。
- 它们的数组初始化大小和扩容方式不一样,HashTable中hash数组默认大小是11,增加的方式是 old*2+1。HashMap中hash数组的默认大小是16,而且一定是2的指数。
因为同步对你来说不是个问题,我推荐使用HashMap。如果同步成为问题,你可能还要看看ConcurrentHashMap。
参考资料
- http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/ConcurrentHashMap.html
- http://docs.oracle.com/javase/7/docs/api/java/util/Hashtable.html
- http://docs.oracle.com/javase/7/docs/api/java/util/HashMap.html
- http://docs.oracle.com/javase/7/docs/api/java/util/LinkedHashMap.html
- http://stackoverflow.com/questions/40471/differences-between-hashmap-and-hashtable
: » java 中 HashMap 和 Hashtable 之间的不同
原创文章,作者:wure,如若转载,请注明出处:https://blog.ytso.com/tech/java/251592.html