HashMap和Hashtable的区别

HashMap和Hashtable一样,同样都存储的键值对。

区别的地方主要区别在于

HashMap是线程不安全的,而Hashtable是线程安全的。

Hashtable在对集合操作的时候都加上了synchronized来保证线程的同步。

HashMap可以使用null作为key,而Hashtable则不允许null作为key。

HashMap中如果key为null,则key的hash则为0.

    static final int hash(Object key) {
        int h;
        return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);
    }

Hashtable如果传入的key为null,则直接抛出控指针异常

 public synchronized V put(K key, V value) {
        // Make sure the value is not null
        if (value == null) {
            throw new NullPointerException();
        }
}

HashMap的初始容量为16,Hashtable初始容量为11

两者计算hash的方法不同

Hashtable计算hash是直接使用key的hashcode对table数组的长度直接进行取模

        int hash = key.hashCode();
        int index = (hash & 0x7FFFFFFF) % tab.length;

HashMap计算hash对key的hashcode进行了二次hash,以获得更好的散列值,然后对table数组长度取摸

    static final int hash(Object key) {
        int h;
        return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);
    }
    // 1.8中这句话是不存在的,是直接使用(n - 1) & hash,n是的大小
    static int indexFor(int h, int length) {
        return h & (length-1);
    }

Hashtable的源码比HashMap简单不少,hash冲突链表也不会自动转为红黑树

如果要是在高并发下使用HashMap的话,可以使用java并发包下的ConcurrentHashMap,采用分段锁,效率更高

你可能感兴趣的:(HashMap和Hashtable的区别)