聊聊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的数据结构和底层实现,知识点比较零碎,但是也是面试中经常问到的点。
- 点赞
- 收藏
- 关注作者
评论(0)