聊聊 hashmap
聊聊 hashmap
hashmap 是个老生常谈的话题了,面试中也经常会问到,今天我们再盘点一下
hashTable
hashmap 没有使用 synchronized 修饰,所以它是线程不安全的,而 hashTable 是线程的安全的,另外 hashmap 可以出现 key 为 null,value 也为 null 的情况,key 为 null 的时候存储位置是下标为 0 的位置,而 hashTable 没有这种操作
数据结构
大家都知道 hashmap 采用的是数组加链表的形式存储的,在 jdk8 之后呢当链表的高度到达 8,数组长度超过 64 的时候,链表就会转为红黑树,红黑树中元素以 node 结构存在,数组长度低于 6 的时候,红黑树就会转回链表的形式
CurrentHashMap
而在保证线程安全这一块,我们都不使用 hashTable,而是使用 CurrentHashMap,CurrentHashMap 比 HashTable 的效率要高,CurrentHashMap 的 jdk7 和 jdk8 的数据结构还不太一样,jdk7 是采用 Segment 和 HashEntry 对象,Segment 继承 ReentrantLock,我们加锁的时候锁住的是一个 Segment,其他 Segment 不受影响,而获取数据的时候不需要加锁,它是通过 volatile 来保证可见性的,一个 Segment 中有一个 HashEntry 数组,而 HashEntry 使用的是链表的结构,当我们在查询一个元素的时候,首先定位的是元素所在的 Segment,然后在找到这个 Segment 下的元素的具体位置在 jdk8 之后 CurrentHashMap 使用 CAS 和红黑树,Node 节点的值和指向下一个的指针都是使用 volatile 来进行修饰的,因此在读操作的时候能够保证可见性,而 CurrentHashMap 的查找,赋值,替换等操作都是通过 CAS 来实现的,对于加锁,锁住的是链表的 head 节点,粒度比 Segment 更细,不影响其他元素的读写操作,在扩容的时候会阻塞所有的读写操作
总结
本篇主要以 hashmap 为主题,讲了 hashmap 的数据结构并延伸说了一下 currentHashMap 的数据结构和底层实现,知识点比较零碎,但是也是面试中经常问到的点。
❤️ 感谢大家
如果你觉得这篇内容对你挺有有帮助的话:
欢迎关注我❤️,点赞👍🏻,评论🤤,转发🙏
关注
盼盼小课堂
,定期为你推送好文,还有群聊不定期抽奖活动,可以畅所欲言,与大神们一起交流,一起学习。有不当之处欢迎批评指正。
版权声明: 本文为 InfoQ 作者【周杰伦本人】的原创文章。
原文链接:【http://xie.infoq.cn/article/425295e1c8fc780adc451eb16】。文章转载请联系作者。
评论