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,采用分段锁,效率更高

最后编辑于 :
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 格式没编辑好,重新编辑下:https://www.jianshu.com/p/8bc27ec4d412 HashM...
    天外之石阅读 1,673评论 0赞 2
  • 实际上,HashSet 和 HashMap 之间有很多相似之处,对于 HashSet 而言,系统采用 Hash 算...
    曹振华阅读 2,590评论 1赞 37
  • HashMap 是 Java 面试必考的知识点,面试官从这个小知识点就可以了解我们对 Java 基础的掌握程度。网...
    野狗子嗷嗷嗷阅读 6,860评论 9赞 107
  • HashMap和Hashtable都实现了Map接口,但决定用哪一个之前先要弄清楚它们之间的区别。 主要的区别有:...
    SinX竟然被占用了阅读 454评论 0赞 0
  • 海鸥盘旋了一天 终于找了个角落 忙忙碌碌的人儿啊 何时可以过这样的生活 多想背上行囊 做一个梦在远方的旅者 现实的...
    心语2016阅读 190评论 1赞 0

友情链接更多精彩内容