背景

在1.7之前的版本,当数组元素较多(几百、几千,或者更多)的时候,在这种前提扩容,涉及全量元素的遍历和坐标的重新定位,这个耗时会比较长。这是之前存在的一个弊端吧。那么引入红黑树之后就解决了问题,那是怎么解决的呢,我说下自己的理解。

过程分析

既然数组扩容导致了变慢,那就是从扩容方向思考,谁决定了扩容呢?负载因子和数组长度。数组长度是resize自动做的,所以对用户来讲这应该是一个关注不到的变量,那就只剩负载因子了。负载因子越大,扩容的频率就越低。

1. 负载因子较小(小于1)

hash碰撞几率小,当数组元素链表长度达到8个的时候才会转成红黑树,满足这种条件的应该很极端很极端了,与JDK1.7之前的差异其实不大,存在扩容时卡顿。

2. 负载因子较大(大于1)

hash碰撞几率大,所以一个数组元素出现红黑树的几率变大,每个树的数量也会很多。因为扩容的阈值调的比较大,导致轻易不会扩容,整个hashmap更偏向与一颗颗红黑树。扩容就可以理解为对红黑树的维护,达到了丝般顺滑的效果。

总结

根据前面的分析,引入红黑树主要好处有2个:

  1. 极端情况下,保证hashmap碰撞过多的元素的高性能操作。
  2. 负载因子变大情况,使hashmap倾向于一个红黑树的数组,带来的好处就是对元素的操作时间复杂度的整体稳定。

本质上还是得具体场景的权衡,如果数组太大,扩容会导致外部调用超时那就选择调大负载因子,达到削峰的目的。否则维持以前的用法就可以了,

完。

关于JDK1.7+中HashMap对红黑树场景的思考的更多相关文章

  1. JDK1.8中HashMap实现

    JDK1.8中的HashMap实现跟JDK1.7中的实现有很大差别.下面分析JDK1.8中的实现,主要看put和get方法. 构造方法的时候并没有初始化,而是在第一次put的时候初始化 putVal方 ...

  2. JDK1.7中HashMap死环问题及JDK1.8中对HashMap的优化源码详解

    一.JDK1.7中HashMap扩容死锁问题 我们首先来看一下JDK1.7中put方法的源码 我们打开addEntry方法如下,它会判断数组当前容量是否已经超过的阈值,例如假设当前的数组容量是16,加 ...

  3. 怎样的操作才能让HashMap以红黑树类型存储数据? (文中没有解答该问题)

    怎样才能让HashMap以红黑树类型存储数据? 看上面的代码可知:如果一个Node的长度大于等于7.就会触发Node转TreeNode的操作. 我向一个map中插入了一百万条数据(插入一亿条时,内存溢 ...

  4. 浅析Java源码之HashMap外传-红黑树Treenode(已鸽)

    (这篇文章暂时鸽了,有点理解不能,点进来的小伙伴可以撤了) 刚开始准备在HashMap中直接把红黑树也过了的,结果发现这个类不是一般的麻烦,所以单独开一篇. 由于红黑树之前完全没接触过,所以这篇博客相 ...

  5. 为什么HashMap使用红黑树而不使用AVL树

    为什么HashMap使用红黑树而不使用AVL树? 红黑树适用于大量插入和删除:因为它是非严格的平衡树:只要从根节点到叶子节点的最长路径不超过最短路径的2倍,就不用进行平衡调节 AVL 树是严格的平衡树 ...

  6. 【Java源码】集合类-JDK1.8 哈希表-红黑树-HashMap总结

    JDK 1.8 HashMap是数组+链表+红黑树实现的,在阅读HashMap的源码之前先来回顾一下大学课本数据结构中的哈希表和红黑树. 什么是哈希表? 在存储结构中,关键值key通过一种关系f和唯一 ...

  7. JDK1.7中HashMap底层实现原理

    一.数据结构 HashMap中的数据结构是数组+单链表的组合,以键值对(key-value)的形式存储元素的,通过put()和get()方法储存和获取对象. (方块表示Entry对象,横排表示数组ta ...

  8. java随笔——HashMap与红黑树

    前言: hashmap是一种很常用的数据结构,其使用方便快捷,接下来笔者将给大家深入解析这个数据结构,让大家能在用的时候知其然,也知其所以然. 一.Map 首先,从最基本的讲起,我们先来认识一下map ...

  9. HashMap之红黑树

    红黑树的设计,相比 jdk1.7 的 HashMap 而言,jdk1.8 最重要的就是引入了红黑树的设计,当冲突的链表长度超过 8 个的时候,链表结构就会转为红黑树结构. 01.故事的起因 “ JDK ...

随机推荐

  1. Linux内存管理专题

    Linux的内存管理涉及到的内容非常庞杂,而且与内核的方方面面耦合在一起,想要理解透彻非常困难. 在开始学习之前进行了一些准备工作<如何展开Linux Memory Management学习?& ...

  2. 随心测试_数据库_003 <数据库存储结构>

    接上篇:了解了_数据库系统组成,继续理解必备知识点:数据库存储_逻辑结构 快速理解 数据存储结构:数据库系统_数据库_表 1. 理解什么是数据库 数据库发展:大致由 人工管理.文件系统.数据库系统(高 ...

  3. 【alpha阶段】第十次Scrum Meeting

    每日任务内容 队员 昨日完成任务 明日要完成的任务 牛宇航 #26 评价总览接口编写https://github.com/rRetr0Git/rateMyCourse/issues/26 alpha阶 ...

  4. Django Rest Framework(二)

    •基于Django 先创建一个django项目,在项目中创建一些表,用来测试rest framework的各种组件 models.py class UserInfo(models.Model): &q ...

  5. Linux下网络配置与修改Centos7为列

    一.基础知识 手动绑定: 命令 一般是临时的修改,重启后失效,如:ifconfig.route.ip addr等. 修改配置文件 修改文件配置,永久有效,但是可能不能立即生效,需要重启服务 (serv ...

  6. PY3_线程红绿灯

    # Author:jum_# event 事件监测 红灯停绿灯行 线程标志位# 事件主要提供了三个方法wait.clear.set# clear:将“Flag”设置为False#set:将“Flag” ...

  7. tomcat server.xml结构

    所有xml文件使用的文件头 <?xml version='1.0' encoding='utf-8'?> 2 <Server port="8005" shutdo ...

  8. codeforces16B

    Burglar and Matches CodeForces - 16B A burglar got into a matches warehouse and wants to steal as ma ...

  9. 【长期更新】迈向现代化的 .Net 配置指北

    1. 欢呼 .NET Standard 时代 我现在已不大提 .Net Core,对于我来说,未来的开发将是基于 .NET Standard,不仅仅是 面向未来 ,也是 面向过去:不只是 .Net C ...

  10. Linux lvs-NAT模式配置详解

    本篇文档主要是记录NAT模式实现过程,以及各配置步骤的原理.“lvs三种模式工作原理”中描述了LVS的NAT.DR.TUN三种模式的工作原理. NAT模式是通过director将报文目标IP地址修改, ...