前言

看到一个JDK1.7和JDK1.8中关于HashMap的一个面试题:

JDK1.7和1.8中HashMap中链表的插入的方式有什么不同?

原以为自己对HashMap的源码理解的还算可以了,应该足够应付面试了。但是看到这个问题自己确实也是懵逼了一下。
查了下资料,答案是JDK1.7是插入到首部,1.8改为了尾部。

既然有改变那么就想知道是为什么了,原因其实很简答,JDK1.7中经常面试会问 并发下put 为何会导致死循环?
其实这个死循环到了JDK1.8 就不会出现了,仅仅是因为 put的后的数据放到了链表的尾部。

这里再回顾下JDK1.7 的循环导致死循环的问题,下面的图是手画图,辅助文字说明:
JDK1.7 扩容主要代码:

假设:HashMap中table的大小为2,有两个元素3.7,5 这时会进行扩容,图如下:

图画的很简陋,自己看着边看代码边想出来的。哈哈哈,总感觉用一些在线画图工作看着很别扭,而且是没有灵魂的。(不瞎扯了,扯远了)
这里主要是元素3,7形成了死循环,所以这里会出现问题。

而在JDK1.8 中,因为插入顺序变成了尾部插入,也就是说3的next一直都会为7,元素扩容的情况下不会改变元素的顺序,所以就可以避免这种死链了。

果然看似不起眼的设计都是有自己独特的道理,又加深了自己对HashMap的理解了,每天都能进步一点点,真好。
感谢掘金文章的帮助:HashMap为何从头插入改为尾插入

一道简单的HashMap面试题所想到的...的更多相关文章

  1. 一道简单的JavaScript面试题

    好久没更新博客了,随便写点东西吧. 自从工作之后就特别忙,忙的过程中有时候挺迷茫的,可能是大多数时候写的都是简单的业务代码,很久没好好充电了.最近一直在零碎的上班路上等电梯时间里面学习<图解HT ...

  2. 一道简单的 Java 笔试题,但值得很多人反思!

    前言 面试别人,对我来说是一件新奇事,以前都是别人面试我.我清楚地知道,我在的地域与公司,难以吸引到中国的一流软件人才.所以,我特地调低了期望,很少问什么深入的技术问题,只问一些广泛的.基础的.我只要 ...

  3. 一道简单的IOS面试题-b

    题目: (参考:陈曦 包子的iOS开发)我在code review的时候,发现了某个viewController中有这样一段代码,觉得很不妥当,请尝试找出代码中的任何问题,或者可以优化的部分. -(i ...

  4. 一道简单的python面试题-购物车

    要求实现:1.程序开始运行时要求手动填入工资金额2.然后展示一份带有价格的商品列表3.选择某个商品,足够金额购买就添加到购物车,否则提示无法购买4.退出后列出购物车清单 #!/usr/bin/pyth ...

  5. 一道简单的面试题,难倒各大 Java 高手!

    Java技术栈 www.javastack.cn 优秀的Java技术公众号 最近栈长在我们的<Java技术栈知识星球>上分享的一道 Java 实战面试题,很有意思,现在拿出来和大家分享下, ...

  6. 又一道简单题&&Ladygod(两道思维水题)

    Ladygod Time Limit: 3000/1000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) Submit S ...

  7. CSU 1785: 又一道简单题

    1785: 又一道简单题 Submit Page   Summary   Time Limit: 5 Sec     Memory Limit: 128 Mb     Submitted: 602   ...

  8. QDUOJ 一道简单的数据结构题 栈的使用(括号配对)

    一道简单的数据结构题 发布时间: 2017年6月3日 18:46   最后更新: 2017年6月3日 18:51   时间限制: 1000ms   内存限制: 128M 描述 如果插入“+”和“1”到 ...

  9. 一道关于String的面试题,新鲜出炉,刚被坑过,趁热!!

    很多人都会答错的一道关于String的题目,究竟有什么难度? 我们一起来看一道关于String的面试题,准确说是改编的面试题! 准备好啦?在放大招之前先来一个小招式 String s1 = new S ...

随机推荐

  1. Educational Codeforces Round 26 E - Vasya's Function

    数论题还是好恶心啊. 题目大意:给你两个不超过1e12的数 x,y,定义一个f ( x, y ) 如果y==0 返回 0 否则返回1+ f ( x , y - gcd( x , y ) ); 思路:我 ...

  2. request中获取post的json对象数据content-type=“text/plain”

    其实采用http://www.cnblogs.com/SimonHu1993/p/7295750.html中的方法一都能获取到,就是通过获取request中的流数据,拿到json数据,理论上应该适用各 ...

  3. Ubuntu18.04更换国内源

    Ubuntu18.04更换国内源 Ubuntu本身的源使用的是国内的源,下载速度比较慢,不像CentOS一样yum安装的时候对镜像站点进项选择, 所以选择了更换成国内的源. 以下内容整合自网络 备份/ ...

  4. js算法初窥06(算法模式03-函数式编程)

    在解释什么是函数式编程之前,我们先要说下什么是命令式编程,它们都属于编程范式的一种.命令式编程其实就是一块一块的代码,其中包括了我们要执行的逻辑或者判断或者一些运算.也就是按部就班的一步一步完成我们所 ...

  5. Android二维码学习

    http://www.cnblogs.com/liuan/category/347622.html http://blog.csdn.net/xiaanming/article/details/101 ...

  6. POJ.3710.Christmas Game(博弈论 树上删边游戏 Multi-SG)

    题目链接 \(Description\) 给定n棵"树",每棵"树"的节点可能"挂着"一个环,保证没有环相交,且与树只有一个公共点. 两人轮 ...

  7. Python3内置函数——reversed() = 翻转我的世界

    认识reversed单词 reversed 英[rɪ'vɜ:st] 美[rɪ'vɜst] adj. 颠倒的:相反的:(判决等)撤销的 v. 颠倒(reverse的过去式和过去分词):翻转 help(r ...

  8. [NOIp2013普及组]车站分级

    思路: 对于每一趟车,将区间内所有经停的站和所有未经停的站连一条边,表示前者优先级一定高于后者,然后用Kahn跑一遍拓扑排序即可.然而这样会创造大量多余的边,会TLE1个点.考虑一种优化:因为每趟车本 ...

  9. URL中可以出现的字符

    http://blog.csdn.net/hejisan/article/details/51786969

  10. java学习手册

    http://www.runoob.com/java/java-environment-setup.html