码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • hashmap1.7和1.8的区别


    底层结构:

            hashmap1.7底层结构是entry数组+链表,

            hashmap1.8底层结构是node数组+链表+红黑树

    扩容策略:7上8下(7前8后)

            1.8会保持原链表的顺序并且在元素插入后检测是否需要扩容,扩容后,不会把所有元素重新计算一遍位置;

            1.7会颠倒链表的顺序并且在元素插入前检测是否需要扩容,扩容后,把所有元素重新计算一遍位置,为了降低hash冲突;

    Hashmap中文名哈希映射,是基于哈希表的 Map 接口的实现,HashMap是一个用于存储Key-Value键值对的集合。

    相同key,新值会在数组的位置把旧value值覆盖掉,并返回旧的value值,如果是不同key,但是key计算出来的hash一样,则会在数组中,按照7上8下生成链表;

    1.8什么时候转红黑树,什么时候退化成链表

    红黑树的出现时机(链表树化):1. 链表的长度达到8; 2. 元素的总数量达到64。

    底层数组类型:

            1.7数组类型:entry数组

            1.8数组类型:node数组

    1.7:

    hashMap线程不安全?hashMap在多线程的环境下,会出现什么问题?

    1.会出现丢值 2.会出现环链

    总结:

    1:hashMap底层结构是Entry数组+单项链表

    2:初始容量是0

    3:第一次执行put 方法会初始容量

    4:key 可以为null 并且会储存在下标为0的位置

    5:hashMap为什么无序,因为它的位置是通过hash值和数组长度计算出来的

    6:为什么不能重复,重复的元素,会进行values的覆盖

    7:头插法:新节点会变成老节点的头节点

    8:扩容机制?扩容时机?同时满足储存个数大于加载因子以及数组当前索引不为空才会扩容,扩容为原来的两倍,并重新计算阈值

    9:扩容大小:是原来的两倍

    10:扩容后,把所有元素重新计算一遍位置,为了降低hash冲突

    11:为什么需要加载因子?

    为了减少hash冲突的次数(哈希冲突就是将要存入的位置已经有值),就是减少链表的出现

    12:为什么初始容量是16,这里就不是眼缘了,因为2的幂次方进行位运算速度是最快的

    1.8:

    Java1.8  无参构造没有初始容量大小,只有在put时初始容量newCap=16

    HashMap hashMap=new HashMap(8);也是在put时容量newCap=8

    HashMap hashMap=new HashMap(3);不是说容量为3,而是4,大于等于最小的2的n次方

    HashMap hashMap=new HashMap(3);put第4个数据时,不会报错,他会自动扩容的,是在容量*0.75即就是4*0.75=3,put第三次完成之后开始扩容(1.8扩容时会保持原链表的顺序并且在元素插入后检测是否需要扩容),新容量=旧容量*2,即就是4*2=8

    参考:

    【老生常谈系列】hashMap 1.7 和1.8的区别_EmineWang的博客-CSDN博客_hashmap1.7和1.8的区别

    JDK1.8中的HashMap扩容原理_野狼飞飞的博客-CSDN博客_hashmap1.8扩容

    HashMap1.7和1.8实现原理和区别_EmineWang的博客-CSDN博客_hashmap底层实现原理1.7和1.8

  • 相关阅读:
    小黑leetcode之旅:86. 分隔链表
    从零开始学前端:DOM、BOM、焦点事件、键盘事件 --- 今天你学习了吗?(JS:Day20)
    差分信号的末端并联电容到底有什么作用?
    [附源码]java毕业设计书店网站论文
    【数据结构】C++二叉树的实现(二叉链表),包括初始化,前序、中序、后序、层次遍历,计算节点数、叶子数、高度、宽度,二叉树的复制和销毁
    简明Python教程(面向对象)
    PHP 同城服务共享茶室小程序系统是如何实现的?
    线性表的链式表示——单链表;头插,尾插,按值查找,按序号查找,插入,删除;
    理解SpringBoot的自动装配
    【FRP】群晖docker中部署Frp
  • 原文地址:https://blog.csdn.net/zhangleiyes123/article/details/126490140
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号