HashMap、HashTable和ConcurrentHashMap的区别

一、HashMap

1. 什么是HashMap?

HashMap内部是了一个存储数据的Entry数组(每个元素都是一个key-value对),HashMap采用链表解决哈希冲突,每一个Entry本质上是一个单向链表。当数组容量不足时,会自动扩容。


hashMap.png

2. HashMap中添加元素的过程

HashMap的put方法.png
  1. 当准备添加一个key-value对时,首先通过hash(key)方法计算hash值,然后通过indexFor(hash,length)求该key-value对的存储位置,也就是数组的索引index。
  2. 链表是用来解决冲突的,如果不同的key映射到了数组的同一位置处,就将其放入单链表中。
  3. HashMap内存储数据的Entry数组默认是16,如果没有对Entry扩容机制的话,当存储的数据一多,Entry内部的链表会很长,这就失去了HashMap的存储意义了。所以HasnMap内部有自己的扩容机制。
    (1)变量size,它记录HashMap的底层数组中已用槽的数量
    (2)变量threshold,它是HashMap的阈值,用于判断是否需要调整HashMap的容量(threshold = 容量*加载因子)
    (3)HashMap扩容的条件是:当size大于threshold时,对HashMap进行扩容

二、HashMap和HashTable的区别

  1. HashMap线程不安全,HashTable线程安全(synchronized)
  2. HashMap允许key和value同时为null,HashTable不允许null值(key和value都不可以)

三、HashTable和ConcurrentHashMap的区别

  1. HashTable是做了同步,HashMap没有考虑同步。单线程情况下,HashMap的效率较高。在多线程情况下,同步操作能够保证程序执行的正确性,但是HashTable每次同步执行的时候都要锁住整个结构,效率很低。
  2. ConcurrentHashMap
    多线程情况下,线程安全,效率比HashTable高。


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

相关阅读更多精彩内容

友情链接更多精彩内容