HashMap与HashTable都是用来存储key-value键值对元素的集合
一、相同点
- 都是用来存储key-value键值对元素
- 数据结构都是哈希表(基于哈希表来实现的)
- 都不能存储重复的key
- 存储的元素都不是有序的,是无序集合
都是Map接口的具体实现类,如下图
底层都使用 Entry< K,V>[] table 数组存储元素
public class Hashtable<K,V>
extends Dictionary<K,V>
implements Map<K,V>, Cloneable, java.io.Serializable {
/**
* The hash table data.
*/
private transient Entry<K,V>[] table;
public class HashMap<K,V>
extends AbstractMap<K,V>
implements Map<K,V>, Cloneable, Serializable
{
/**
* The table, resized as necessary. Length MUST Always be a power of two.
*/
transient Entry<K,V>[] table;
(注:Entry< K,V> 是HashMap的内部类,Entry类似一个单向链表)
static class Entry<K,V> implements Map.Entry<K,V> {
final K key;
V value;
Entry<K,V> next;
int hash;
/**
* Creates new entry.
*/
Entry(int h, K k, V v, Entry<K,V> n) {
value = v;
next = n;
key = k;
hash = h;
}
二、区别
1、结构上的不同
- HashMap允许存储null元素,包括key为null和value为null(由于Map里的key不能重复,所以HashMap里最多只有一对key-value对的key为null,但可以有无数多项key-value对的value为null。),而Hashtable不能存储null元素(key和value都不能为null)
- HashMap继承了抽象类AbstractMap,而Hashtable继承了Dictionary类
2、性能上的不同
- HashMap是非线程安全的,而Hashtable是线程安全的,Hashtable的方法使用关键字synchronized,能保证线程的同步
- 所以HashMap的效率比Hashtable的效率高
所以在使用Map集合时,建议默认使用HashMap,若涉及线程同步或多线程,则使用Hashtable(其实应该使用ConcurrentHashMap,在保证线程安全的情况下,它的效率比Hashtable的效率高16倍以上,这里不展开叙述)