天天看点

HashMap--concurrentHashMap的一些知识搜集

目录

HashMap

ConCurrentHashMap

面试中经常会被问道:

面试官:有了解HashMap吗,讲一下HashMap吧~
我:呃呃呃~是这样的,balabalbala~

 搜集了网上的一些资料,估计也不全,大致也能说明白这个道理,(仅作为面试参考):

这个事情要从JDK的版本更新说起,话说现在,风云跌宕,大家都讲:我们支持的JDK版本最低为1.8~

好,这就是一个目前的分界线了。

先翻历史,再论现在。

HashMap

JDK1.7

这个版本-HashMap的底层使用数组加链表实现。根据key计算出数据下标,如果多个key对应到同一个下标,就用链表串起来,新插入的放在前面。

JDK1.8

这个版本有了一些变化,底层使用数组+链表/红黑树来实现的。链表长度超过8,就转红黑树,红黑树大小小于6就转回链表

key是如何Hash的呢?
// java HashMap 
static final int hash(Object key) {
        int h;
        return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);
    }
           

不够我说的,太少了,再来点--好的,满足你-

-推荐-唐彤--zhisheng(公众号)--的文章--面试官:HashMap 源码你都不知道还来面试?

tips:除了这些底层结构,加上get --set--这些方法打出来更好--绝对加分项

ConCurrentHashMap

JDK1.7

在Hashmap的基础上,把数据分为了多个segment段,默认16个段,以段来进行加锁操作,提高并发效率。

JDK1.8

取消了,大部分操作不加锁了(红黑树的锁依然存在,如不了解,懂我意思,此处暂不谈论)

不使用Segment分段加锁控制,转为使用Node+CAS+Synchronized来实现,锁的粒度转为HashEntry(首节点)

这些看完觉得不够,怎么够面试说的呢~,这样有办法

推荐 厮大 (公众号-朱小厮的博客)的一篇文章-叫做--为什么ConcurrentHashMap的读操作不需要加锁?

那你要问HashTable,那这样,遥远的从前 java 5开始有了JUC的包,那是已经转用ConcurrentHashMap而不是HashTable了

好了,给你文章,你自己看吧~

知乎问题: HashMap和Hashtable的区别?