将hashmap和currenthashmap放一块进行比较,是因为二者的结构相差不多,只不过后者是线程安全的。

  首先说hashmap,在jdk1.8之前,hashmap的存储结构是数组+链表的形式,可以理解为元素为链表的数组,当添加一个kv对,首先计算key的哈希值,用哈希值对数组长度按位与,以此确定插入的位置,若该位置已有元素,则形成链表,同一链表元素的哈希值相同,当链表数组容量超过初始容量0.75时,将数组扩大一倍。

  由上可以看出,当数据量很大时,每一个位置的链表会变得很长,而链表的平均查找长度是n/2,查找耗时很大。

  因此jdk1.8后hashmap的存储结构更新为桶+链表/红黑树的形式,和之前相差不多,只不过在对链表长度的反应上做出了改变,当链表长度超过8,链表自动转化为红黑树的形式,当长度小于6,仍为链表,这是因为:红黑树的平均查找长度是log(n),当n=8,平均查找长度是3,链表平均查找长度是4,此时才有转换为红黑树的必要。而之所以采用红黑树,就是因为红黑树查找效率高(它是个二叉平衡树)。

  那为什么使用6和8作为链表和红黑树的分割?

  这是因为链表到红黑树的转化过程十分耗费资源,选择6和8,而不是7,就是为了避免频繁增删数据时,不断转换耗费大量资源。

hashmap底层:jdk1.8前后的改变的更多相关文章

  1. jdk1.8源码解析:HashMap底层数据结构之链表转红黑树的具体时机

    本文从三个部分去探究HashMap的链表转红黑树的具体时机: 一.从HashMap中有关“链表转红黑树”阈值的声明: 二.[重点]解析HashMap.put(K key, V value)的源码: 三 ...

  2. Java面试必问之Hashmap底层实现原理(JDK1.7)

    1. 前言 Hashmap可以说是Java面试必问的,一般的面试题会问: Hashmap有哪些特性? Hashmap底层实现原理(get\put\resize) Hashmap怎么解决hash冲突? ...

  3. Java基础系列--HashMap(JDK1.8)

    原创作品,可以转载,但是请标注出处地址:https://www.cnblogs.com/V1haoge/p/10022092.html Java基础系列-HashMap 1.8 概述 HashMap是 ...

  4. HashMap底层结构、原理、扩容机制

    https://www.jianshu.com/p/c1b616ff1130 http://youzhixueyuan.com/the-underlying-structure-and-princip ...

  5. HashMap底层数据结构和算法解析

    1.Hash Map的数据结构? A:哈希表结构(链表散列:数组+链表)实现,结合数组和链表的优点.当链表长度超过8时,链表转换为红黑树. transient Node<K,V>[] ta ...

  6. hashMap 底层原理+LinkedHashMap 底层原理+常见面试题

    1.源码 java1.7    hashMap 底层实现是数组+链表 java1.8 对上面进行优化  数组+链表+红黑树 2.hashmap  是怎么保存数据的. 在hashmap 中有这样一个结构 ...

  7. HashMap底层实现原理

    HashMap底层实现 HashMap底层数据结构如下图,HashMap由“hash函数+数组+单链表”3个要素构成 通过写一个迷你版的HashMap来深刻理解 MyMap接口,定义一个接口,对外暴露 ...

  8. HashMap 底层分析

    以下基于 JDK1.7 分析 如图所示,HashMap底层是基于数组和链表实现的,其中有两个重要的参数: ---容量 ---负载因子 容量的默认大小是16,负载因子是0.75,当HashMap的siz ...

  9. 最简单的HashMap底层原理介绍

    HashMap 底层原理  1.HashMap底层概述 2.JDK1.7实现方式 3.JDK1.8实现方式 4.关键名词 5.相关问题 1.HashMap底层概述 在JDK1.7中HashMap采用的 ...

随机推荐

  1. wireguard使用

    1.编译与安装 sudo apt-get install libmnl-dev libelf-dev linux-headers-$(uname -r) build-essential pkg-con ...

  2. 部署sftp服务

    部署sftp服务有风险,可能造成ssh无法连接到服务器,因此写个脚本定时覆盖一下,保证ssh可以正常使用. 创建数据目录并赋权,创建账号密码,修改ssh文件. * mkdir /sftp groupa ...

  3. Avoided redundant navigation to current location: "/users"

    问题产生的原因:在Vue导航菜单中,重复点击一个菜单,即重复触发一个相同的路由,会报错,但不影响功能 解决:在router的配置文件中加入如下代码: const originalPush = Rout ...

  4. linux打包 压缩 解压tar常归操作

    tar 打包 tar -cvf 打包后路径和文件名.tar 需要打包的路径和文件压缩 tar -zcvf 打包后路径和文件名.tar.gz 需要打包的路径和文件解压 tar -xvf 包名 -C 路径 ...

  5. [PHP安全特性学习]is_numeric()函数安全漏洞

    简介 PHP函数的安全特性-is_numerice() 函数 简介 PHP is_numeric() 函数 is_numeric() 函数用于检测变量是否为数字或数字字符串. 语法: bool is_ ...

  6. 攻克solo第五课(Mixolydian 音阶)

    相对于独奏来说,我们已经说过了很多关于solo或独奏的乐理和技巧.那么这篇文章,笔者将使用guitar pro7软件来跟大家分享Mixolydian 音阶的演奏技巧,以及如何在学习Mixolydian ...

  7. jenkins运行错误解决办法

    本地搭建好jenkis服务器,运行然后登陆上管理后台 构建好运行命令,然后进行构建出现如下错误说没有python运行环境 ,本地已经配置好python环境,并且终端能正常运行. 解决方法:jenkin ...

  8. 项目开发中的git简单使用

    原文地址: https://www.zhuyilong.fun/tech/the-blog-git.html 示例远程仓库地址: https://github.com/zhu-longge/gitWo ...

  9. 【CF375D】Trees and Queries——树上启发式合并

    (题面不是来自Luogu) 题目描述 有一个大小为n且以1为根的树,树上每个点都有对应的颜色ci.现给出m次询问v, k,问以v为根的子树中有多少种颜色至少出现了k次. 输入格式 第一行两个数n,m表 ...

  10. IDEA2020.2.4最新激活教程,有效期到2089

    前言 昨天又有好多粉丝反馈Idea失效过期,也有群里的小伙伴私聊问我,最新的Idea2020.2.4 版本要如何激活? 于是自己在网上搜罗了各种注册码.激活码,均以失败告终,有的虽然当时成功了,当时很 ...