目录
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的区别?