聊聊hashmap

举报
周杰伦本人 发表于 2022/07/27 14:11:36 2022/07/27
【摘要】 聊聊hashmaphashmap是个老生常谈的话题了,面试中也经常会问到,今天我们再盘点一下 hashTablehashmap没有使用synchronized修饰,所以它是线程不安全的,而hashTable是线程的安全的,另外hashmap可以出现key为null,value也为null的情况,key为null的时候存储位置是下标为0的位置,而hashTable没有这种操作 数据结构大家都...

聊聊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的数据结构和底层实现,知识点比较零碎,但是也是面试中经常问到的点。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。