jdk1.7与jdk1.8的HashMap区别1-基本结构与属性对比

一、数据结构差别

  • 1.7:数组+链表

  • 1.8:数组+链表+红黑树

  • 当链表的长度大于8时,数组长度大于64,原来的链表数据结构变为红黑树

二、HashMap中的关键属性和方法区别

方法/变量/类

JDK7

JDK8

备注

DEFAULT_INITIAL_CAPACITY

16

16

默认初始的大小16

MAXIMUM_CAPACITY

2的30

2的30

最大的key的容量

DEFAULT_LOAD_FACTOR

0.75

0.75

默认的负载因子

table

Entry[]

Node<K,V>[]

JDK7:表,根据需要调整大小。长度必须始终是二的幂。

JDK8:该表在首次使用时初始化,并根据需要调整大小。分配时,长度总是二的幂。(我们在某些操作中也允许长度为零,以允许目前不需要的自举机制。)

size

int

int

此映射中包含的键值映射数。

threshold

Int

int

要调整大小的下一个大小值(容量*负载系数)。

loadFactor

float

float

哈希表的加载因子。

modCount

int

int

该HashMap在结构上被修改的次数结构修改是指改变HashMap中映射数量或以其他方式修改其内部结构(例如,rehash)的修改。该字段用于使HashMap的Collection视图上的迭代器快速失败。(请参见ConcurrentModificationException)。

TREEIFY_THRESHOLD

8

为bin使用树而不是列表的bin计数阈值。当向至少有这么多节点的bin添加元素时,bin会转换为树。该值必须大于2,并且应至少为8,将转化成树(链表转成树条件)

UNTREEIFY_THRESHOLD

6

在调整大小操作期间用于取消检测(拆分)桶的长度计数阈值。应小于TREEIFY_THRESHOLD,并且最多为6,以便在移除时进行收缩检测。(树退化成链表的条件)

MIN_TREEIFY_CAPACITY

64

可以将存储箱树化的最小表容量。(否则,如果一个bin中的节点太多,则会调整表的大小。)应至少为4*TREEIFY_THRESHOLD,以避免调整大小阈值和树化阈值之间的冲突。(链表转成树条件或者退化条件)

hash

static int

static final int

Jdk7:将补充散列函数应用于给定的hashCode防御质量较差的散列函数。这是至关重要的

因为HashMap使用两个长度哈希表的幂否则会遇到没有差异的hashCode冲突以较低的比特。注意:空键总是映射到哈希0,因此索引

JDK8:计算key.hashCode()并将哈希的高位扩展(XOR)到低位。因为该表使用两个掩码的幂,所以仅在当前掩码之上以位为单位变化的哈希集总是会发生冲突。(已知的例子包括在小表中保存连续整数的Float键集。)因此,我们应用了一种向下扩展高位影响的变换。比特扩展的速度、效用和质量之间存在折衷。因为许多常见的哈希集已经合理分布(因此不会从扩展中受益),而且因为我们使用树来处理箱中的大型冲突集,所以我们只需以最便宜的方式对一些移位的比特进行异或运算,以减少系统损失,并合并最高比特的影响,否则由于表边界的原因,这些比特将永远不会用于索引计算。

Entry<K,V>

implements Map.Entry<K,V>

Node<K,V>

新增

implements Map.Entry<K,V>

JDK8:基本hash bin节点,用于大多数条目。

entrySet

Set<Map.Entry<K,V>>

保留缓存的entrySet()。请注意,AbstractMap字段用于keySet()和values()。

putIfAbsent

新增

如果传入key对应的value已经存在,就返回存在的value,不进行替换。如果不存在,就添加key和value,返回null

computeIfAbsent

新增

方法计算一个新值,如果该键没有与哈希映射中的任何值相关联,则将其与指定的键相关联。

import java.util.HashMap;

class Main {

  public static void main(String[] args) {

    // 创建 HashMap

    HashMap<String, Integer> digitals= new HashMap<>();

    // 向HashMap插入条目

    prices.put("A", 20);

    prices.put("B", 30);

    prices.put("C", 15);

    System.out.println("HashMap: " + digital);

// 简单用法

int afterChangeDigital = prices.computeIfAbsent("B", key -> 280);

    System.out.println("B的数字: " + afterChangeDigital );

    // 打印更新HashMap

    System.out.println("更新后的 HashMap: " + digitals);

  }

}

UnsafeHolder

新增

支持在反序列化期间重置最终字段

HashIterator

JDK7:private abstract class H HashIterator<E> implements Iterator<E>

HDK8:abstract class HashIterator

TreeNode

新增

树节点

三、JDK1.8版本优点

1.对于1.7来讲,1.8版本的HashMap在数据量大的时候,HashCode相同的大于8,且数组的数量大于64的时候,链表会转化成红黑树,红黑树查询效率更高

2.JDK8版本新特性来讲,具有流及函数计算特点

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/51910.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

一个类似Office用户界面的WPF库

博主介绍&#xff1a; &#x1f308;一个10年开发经验.Net老程序员&#xff0c;微软MVP、博客专家、CSDN/阿里云 .Net领域优质创作者&#xff0c;专注于.Net领域知识、开源项目分享&#xff01;&#x1f308; &#x1f6d5;文末获取&#xff0c;加入交流群&#x1f6d5; &#…

HTML一些基础知识

1、Web标准&#xff1a;主要包含结构、表现、行为。结构用于对网页元素进行整理和分类&#xff0c;主要指HTML。表现用于设置网页元素的板式、颜色、大小等外观样式&#xff0c;主要指的是CSS。行为主要指的是网页模型的定义以及交互的编写&#xff0c;主要是js文件。 Html相当…

css定义超级链接a标签里面的title的样式

效果: 代码: 总结:此css 使用于任何元素,不仅仅是a标签!

时序预测 | MATLAB实现NARX-ANFIS时间序列预测

时序预测 | MATLAB实现NARX-ANFIS时间序列预测 目录 时序预测 | MATLAB实现NARX-ANFIS时间序列预测效果一览基本介绍研究内容程序设计参考资料效果一览

基于Open3D的点云处理13-分割

平面分割&#xff08;基于RANSAC&#xff09; 使用RANSAC算法从点云中拟合平面&#xff1b; 接口&#xff1a;segment_plane 测试&#xff1a;Plane-segmentation import open3d as o3dpcd_point_cloud o3d.data.PCDPointCloud() pcd o3d.io.read_point_cloud(pcd_point_cl…

安防监控视频汇聚EasyCVR修改录像计划等待时间较长,是什么原因?

安防监控视频EasyCVR视频融合汇聚平台基于云边端智能协同&#xff0c;支持海量视频的轻量化接入与汇聚、转码与处理、全网智能分发等。音视频流媒体视频平台EasyCVR拓展性强&#xff0c;视频能力丰富&#xff0c;具体可实现视频监控直播、视频轮播、视频录像、云存储、回放与检…

基于传统检测算法hog+svm实现图像多分类

直接上效果图&#xff1a; 代码仓库和视频演示b站视频005期&#xff1a; 到此一游7758258的个人空间-到此一游7758258个人主页-哔哩哔哩视频 代码展示&#xff1a; 数据集在datasets文件夹下 运行01train.py即可训练 训练结束后会保存模型在本地 运行02pyqt.py会有一个可视化…

【C语言】函数重难点之函数递归

大家好&#xff0c;我是深鱼~ 目录 一、函数递归知识讲解 1.什么是递归&#xff1f; 2.递归的两个必要条件 2.1练习1&#xff1a; 2.2练习2&#xff1a; 二、递归与迭代 2.1练习3 2.2练习4 一、函数递归知识讲解 1.什么是递归&#xff1f; 程序调用自身的编程技巧称为…

Github Copilot在JetBrains软件中登录Github失败的解决方案

背景 我在成功通过了Github Copilot的学生认证之后&#xff0c;在VS Code和PyCharm中安装了Github Copilot插件&#xff0c;但在PyCharm中插件出现了问题&#xff0c;在登录Github时会一直Retrieving Github Device Code&#xff0c;最终登录失败。 我尝试了网上修改DNS&…

ARM裸机-8

1、ARM的编程模式和工作模式 1.1、ARM的基本设定 ARM采用的是32位架构 ARM约定&#xff1a; - Byte&#xff1a;8 bits - Halfword &#xff1a;16 bits (2 byte) - Word&#xff1a;32 bits (4 byte) 大部分ARM core 提供&#xff1a; - ARM 指令集 (32-bit) - Thumb 指令集 …

微信小程序中使用echarts方法

小程序中使用echarts echarts是一个基于JS的数据可视化图标库&#xff0c;它提供了直观&#xff0c;生动&#xff0c;可交互&#xff0c;可个性定制的数据可视化图表。一般在vue中会使用到&#xff0c;并且官网也详细的说明了如何在vue中使用&#xff0c;但是今天我想来探讨的…

【解析excel】利用easyexcel解析excel

【解析excel】利用easyexcel解析excel POM监听类工具类测试类部分测试结果备注其他 EasyExcel Java解析、生成Excel比较有名的框架有Apache poi、jxl。但他们都存在一个严重的问题就是非常的耗内存&#xff0c;poi有一套SAX模式的API可以一定程度的解决一些内存溢出的问题&…

iOS开发-自定义TabbarController与Tabbar按钮Badge角标

iOS开发-自定义Tabbar按钮Badge角标 Tabbar是放在APP底部的控件。UITabbarController是一个非常常见的一种展示模式了。比如微信、QQ都是使用tabbar来进行功能分类的管理。 一、实现自定义Tabbar 我这里Tabbar继承于系统的UITabBar&#xff0c;定义背景图、线条的颜色、tab…

AI编程常用工具 Jupyter Notebook

点击上方蓝色字体&#xff0c;选择“设为星标” 回复”云原生“获取基础架构实践 深度学习编程常用工具 我们先来看 4 个常用的编程工具&#xff1a;Sublime Text、Vim、Jupyter。虽然我介绍的是 Jupyter&#xff0c;但并不是要求你必须使用它&#xff0c;你也可以根据自己的喜…

VS Code环境配置问题

VS Code 环境配置问题 文章目录 VS Code 环境配置问题配置 C问题解决不乱码只显示结果避免闪退&#xff0c;中文乱码 配置 Java下载 JDKJDK 环境配置安装插件 配置 C 跟着官网教程&#xff08;英文版&#xff09;和其他博客配置了一遍&#xff0c;却遇到了很多小问题&#xff…

应用无线鼠标中的2.4GHz无线收发芯片

无线键盘和无线鼠标作为现代办公环境中常见的工具&#xff0c;为我们的工作带来了便利。无线键盘和无线鼠标的工作原理都是基于无线技术实现的&#xff0c;其中常见的是2.4GHz无线技术。让我们一起来详细了解一下它们的工作原理。 无线鼠标的原理非常简单,鼠标部分工作与传统鼠…

Spring中IOC容器常用的接口和具体的实现类

在Spring框架没有出现之前&#xff0c;在Java语言中&#xff0c;程序员们创建对象一般都是通过关键字new来完成&#xff0c;那时流行一句话“万物即可new&#xff0c;包括女朋友”。但是这种创建对象的方式维护成本很高&#xff0c;而且对于类之间的相互关联关系很不友好。鉴于…

【Tomcat---1】IDEA控制台tomcat日志输出乱码解决

一、修改IDEA的文件编码配置为UTF-8 二、修改IDEA的vmoptions文件&#xff0c;添加-Dfile.encodingUTF-8 到Tomcat目录/conf文件夹修改logging.properties 重启idea即可。采用统一的编码

解决在云服务器开放端口号以后telnet还是无法连接的问题

这里用阿里云服务器举例&#xff0c;在安全组开放了对应的TCP端口以后。使用windows的cmd下的telnet命令&#xff0c;还是无法正常连接。 telnet IP地址 端口号解决方法1&#xff1a; 在轻量服务器控制台的防火墙规则中添加放行端口。 阿里云-管理防火墙 如图&#xff0c;开放…

CAN转ETHERCAT网关将CAN 总线和 ETHERCAT 网络连接方法

由于好多现场会出现将CAN总线的设备接到EtherCAT网络中&#xff0c;由于协议的不相同&#xff0c;不能直接进行连接&#xff0c;现需一种能同时兼容CAN 总线和ETHERCAT网络的一种设备&#xff0c;由此捷米JM-ECT-CAN 是自主研发的一款 ETHERCAT 从站功能的通讯网关。该产品主要…