美文网首页
HashMap和Hashtable的区别

HashMap和Hashtable的区别

作者: zxcvbnmzsedr | 来源:发表于2017-07-13 13:47 被阅读0次

    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的区别

          本文链接:https://www.haomeiwen.com/subject/ptpwhxtx.html