您的位置:首页 > 编程语言 > Java开发

java学会这些,我就入门啦!(基础篇六)HashMap、Hashtable、ConcurrentHashMap的原理与区别

2020-01-11 17:19 337 查看

​HashMap、Hashtable、ConcurrentHashMap的原理与区别

这个是一般是面试必备的题目,这里放在基础讲是因为这个东西确实不难,但是衍生出来能问的东西确实多。话不多说,我们下面就来讲一讲。

我们先进行Hashtable与HashMap的比对:

Hashtable与HashMap,他们之间的最大的区别在与Hashtable是线程安全的,而HashMap不是线程安全的,Hashtable是在java开始发布时就提供的键值映射的数据结构,而HashMap产生于JDK1.2。现在Hashtable基本已经失去了使用常见,究其原因第一可能是因为效率慢,但还有很大一部分原因估计是因为没有遵循驼峰命名。说实话,我这个强迫症看着他就非常难受!其他还有一些不同就是他们的父类也不一样,HashMap是继承自AbstractMap类,而Hashtable继承自Dictionary类,还有就是Hashtable无论是key还是value都不能为null,实现线程安全的时候是锁住整个Hashtable,效率超级低。果然,没人用的东西必然有不可取之处。

我们再来看看ConcurrentHashMap:

hashMap与ConcurrentHashMap,他们之间的区别其实跟hashtable与hashMap的区别差不多,也是ConcurrentHashMap是线程安全的,但是hashtable是使用的是synchronized关键字,而ConcurrentHashMap使用的是分段锁技术,他融合了hashMap与synchronized的优点,ConcurrentHashMap默认将hash表分为16个区间,正常的操作只需要使用到当前的区间,这样看来,原来只能一个线程进入的,现在却能16个线程同时进入,读线程几乎不受任何影响,写入才会锁定,性能的提升简直不可同日而语。

面试官问你hashMap的原理的时候怎么办?

这里我帮你们整理了一段话术,hashMap是一个数组加链表的结构,它本身是一个特殊的数组结构,初始长度为16,加载因子是0.75,也就是每当存储的长度到达当前最大长度的0.75时就会扩容。他是put方法是根据键值对的键hash一下算出他的hash值,根据hash值计算出要添加的键值对放到哪个位置。当格子里面已经存在元素的时候,就把新的键值对放到已经存在格子的链表中。反之,get方法也差不多,先根据键获得hash值,根据hash值知道元素放在哪个格子里面,进入格子中,对格子里的元素的键进行逐个比对,比对完成后,取出对应的值就好了。

关注我!你会更强!

  • 点赞
  • 收藏
  • 分享
  • 文章举报
JAVA开发大本营 发布了33 篇原创文章 · 获赞 2 · 访问量 1276 私信 关注
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: