zoukankan      html  css  js  c++  java
  • 一道简单的HashMap面试题所想到的...

    前言

    看到一个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为何从头插入改为尾插入

  • 相关阅读:
    Linux 安装中文man手册
    centos6.9使用NTFS-3G挂载ntfs文件系统
    Linux基础知识之挂载详解(mount,umount及开机自动挂载)
    技术点总结
    SQL 分组后获取其中一个字段最大值的整条记录 【转载】
    线程池之ThreadPool类与辅助线程
    Task.Run使用默认线程池
    VS生成事件
    线程池之ThreadPoolExecutor使用
    Sql笔记
  • 原文地址:https://www.cnblogs.com/wang-meng/p/db8bf82890d552b89674b7d58cacd207.html
Copyright © 2011-2022 走看看