iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >java中HashMap解析put的过程是什么
  • 760
分享到

java中HashMap解析put的过程是什么

2023-07-05 14:07:34 760人浏览 安东尼
摘要

这篇文章主要介绍“java中HashMap解析put的过程是什么”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“java中HashMap解析put的过程是什么”文章能帮助大家解决问题。HashMap解

这篇文章主要介绍“java中HashMap解析put的过程是什么”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“java中HashMap解析put的过程是什么”文章能帮助大家解决问题。

HashMap解析put的过程

首先,用代码运行下,来体会下:

代码实现:

@Testpublic void test1() {//创建了一个HashMapMap<String,Object>map = new HashMap<>();//使用put方法保存数据map.put("age", 12);map.put("name", "gaga");System.out.println(map);}

运行结果:

java中HashMap解析put的过程是什么

首先经过了hash之后的key,是一个整型的hashcode,其次是我们传入的key和value。

首先一进入putVal就会声明存放数据的table,如果这个HashMap是首次设置值,就会被初始化一个默认size的table,且所有元素的初始值都是NULL。

默认值为啥是16

通过源码解析,在注释中会得到“The default initial capacity - MUST be a power of two.”意思是:默认初始容量-必须是2的幂。

java中HashMap解析put的过程是什么

自动扩容

除了size,初始化的时候还会设定一个阈值,值为12,newThr = 12,这里需要提到一个概念负载因子,HashMap的实现里默认给的是0.75。

负载因子是用来干嘛的呢?当我们不停的往map里存数据的时候,总会存满,当元素快存满的时候,我们就需要扩大map的容量,来容纳更多的元素,这就需要一个自动扩容的机制了。

在当数据量大于超过设定的阈值的时候(容量*负载因子),自动对map进行扩容,以存放更多的数据。

自动扩容做了什么事情呢?

  • 创建新的数组,大小是原来数组的一倍。

  • 将元素rehash到新的数组

为什么要rehash呢?上面我们提到过了,当元素被放进map时,确认下标的方法是table的长度-1和hash值做与运算,现在table的长度发生了变化,那么自然而然,元素获取下标的运算结果也就跟之前的不一样了, 所以需要将老的map中的元素再按照新的table长度rehash到扩容后的table中。

put的过程

了解了底层数据结构和自动扩容机制,接下来我们来看一下put过程中究竟发生了什么。

我们上面说过了,会通过数组的长度-1和hash值与运算得到一个数组下标。

如果该位置没有元素,那么就很简单,直接新建一个节点即可然后放置在数据的具体位置即可。

tab[i] = this.newnode(hash, key, value, (HashMap.Node)null);

但是如果该下标已经有元素了,这种情况HashMap是怎么处理的呢?这也要看情况。

如果是跟当前槽位相同的key,就直接覆盖。这就是我们修改某个key的值会发生的情况。

那HashMap怎么来判断是不是同一个key呢?

就像下面这样。p就是当前槽位上已经有的元素,如果新、老元素的key的hashCode和值都相同且key不为空,那么就能证明这两个key是相同的,那么此时只需要覆盖即可。

p.hash == hash && ((k = p.key) == key || (key != null && key.equals(k)))

而如果p是TreeNode的实例,那么就代表当前槽位已经是一个红黑树了,此时只需要往这个树里putTreeVal即可。

至于为什么是红黑树,哪儿来的红黑树,下面马上就要讲到了。

最后一种情况就是,既不是已经存在的元素也不是TreeNode的实例,也不是红黑树。这种情况下,它就是一个普通的Node。

你可以理解为链表,如果hash冲突了,就把这个Node放到该位置的链表末尾。

当该位置的链表中的元素超过了TREEIFY_THRESHOLD所设置的数量时,就会触发树化,将其转化为红黑树。Java8里给的默认值是8。

java中HashMap解析put的过程是什么

java中HashMap解析put的过程是什么

为啥要转化成红黑树?

首先我们要知道为什么要树化。

当大量的数据放入Map中,Hash冲突会越来越多,某些位置就会出现一个很长的链表的情况。

这种情况下,查询时间复杂度是O(n) ,删除的时间复杂度也是O(n),查询、删除的效率会大大降低。

而同样的数据情况下,平衡二叉树的时间复杂度都是O(logn)。

关于“java中HashMap解析put的过程是什么”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识,可以关注编程网精选频道,小编每天都会为大家更新不同的知识点。

--结束END--

本文标题: java中HashMap解析put的过程是什么

本文链接: https://www.lsjlt.com/news/352724.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • java中HashMap解析put的过程是什么
    这篇文章主要介绍“java中HashMap解析put的过程是什么”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“java中HashMap解析put的过程是什么”文章能帮助大家解决问题。HashMap解...
    99+
    2023-07-05
  • java中对HashMap的put过程解读
    目录HashMap解析put的过程默认值为啥是16自动扩容put的过程为啥要转化成红黑树?总结HashMap解析put的过程 首先,用代码运行下,来体会下: 代码实现: @Test ...
    99+
    2023-03-22
    java HashMap HashMap的put过程 java HashMap put
  • 解析HashMap中的put方法执行流程
    目录引言HashMap底层数据结构put方法的执行流程总结引言 在Java集合中,HashMap的重要性不言而喻,作为一种存储键值对的数据结构,它在日常开发中有着非常多的应用场景,也...
    99+
    2024-04-02
  • Java源码解析之HashMap的put、resize方法详解
    目录一、HashMap 简介二、源码分析2.1 继承和实现2.2 属性2.3 节点类型Node内部类2.4 红黑树的节点三、构造方法3.1 构造器13.2 构造器23.3 构造器33...
    99+
    2024-04-02
  • Java中HashMap是什么
    这篇文章主要介绍Java中HashMap是什么,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!一、HashMap的结构图示本文主要说的是jdk1.8版本中的实现。而1.8中HashMap是数组+链表+红黑树实现的,大概...
    99+
    2023-06-15
  • HashMap在JDK7与JDK8中的实现过程解析
    HashMap的实现原理 首先有一个每个元素都是链表(可能表述不准确)的数组,当添加一个元素(key-value)时,就首先计算元素key的hash值,以此确定插入数组中的位置,但是...
    99+
    2024-04-02
  • Java中new hashmap的用法是什么
    在Java中,使用new HashMap<>()可以实例化一个新的HashMap对象,可以用来存储键值对数据。HashM...
    99+
    2024-03-02
    Java
  • Java中HashMap的hash方法原理是什么
    本篇内容主要讲解“Java中HashMap的hash方法原理是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Java中HashMap的hash方法原理是什么”吧!来看一下 hash 方法的源...
    99+
    2023-06-25
  • Java中为什么HashMap线程不安全
    本篇内容主要讲解“Java中为什么HashMap线程不安全”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Java中为什么HashMap线程不安全”吧!01、多线程下扩容会死循环众所周知,Hash...
    99+
    2023-06-25
  • java hashmap扩容的方法是什么
    Java HashMap的扩容方法是通过调用`resize()`方法来实现的。在HashMap的内部实现中,有一个`threshol...
    99+
    2023-08-26
    java hashmap
  • Java入门中Hashtable和HashMap的区别是什么
    这篇文章将为大家详细讲解有关Java入门中Hashtable和HashMap的区别是什么,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。Hashtable和HashMap的区别:1.Hasht...
    99+
    2023-06-03
  • Java基础:为什么hashmap是线程不安全的?
    原因 HashMap 是线程不安全的主要原因是它的内部结构和操作不是线程安全的。下面是一些导致 HashMap 线程不安全的因素: 非同步操作:HashMap 的操作不是线程同步的,也就是说,在多线...
    99+
    2023-09-17
    java
  • hbase中put的使用方法是什么
    在HBase中,可以使用Put类来向表中插入数据。Put类的构造函数接受一个rowkey作为参数,然后可以使用addColumn方法...
    99+
    2024-04-02
  • Java中jvm的执行过程是什么
    这期内容当中小编将会给大家带来有关Java中jvm的执行过程是什么,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。Java的优点是什么1. 简单,只需理解基本的概念,就可以编写适合于各种情况的应用程序;2....
    99+
    2023-06-14
  • kotlin中hashmap的用法是什么
    在Kotlin中,HashMap是一种可变的集合,用于存储键值对。以下是HashMap的基本用法示例: // 创建一个空的HashM...
    99+
    2024-04-02
  • Java并发指南13:Java 中的 HashMap 和 ConcurrentHashMap 全解析
    本文转自:https://www.javadoop.com/本系列文章将整理到我在GitHub上的《Java面试指南》仓库,更多精彩内容请到我的仓库里查看https://github.com/h3pl/Java-Tutorial喜欢的话麻烦...
    99+
    2023-06-02
  • Nginx动态域名解析的过程是什么
    本文小编为大家详细介绍“Nginx动态域名解析的过程是什么”,内容详细,步骤清晰,细节处理妥当,希望这篇“Nginx动态域名解析的过程是什么”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。摘要Nginx进行反向代理...
    99+
    2023-07-05
  • java中的编码转换过程是什么
    在Java中,编码转换的过程通常包括以下几个步骤:1. 读取输入数据:首先,从输入源(例如文件、网络连接或内存)中读取原始的字节数据...
    99+
    2023-08-16
    java
  • Java程序的运行过程是什么
    本篇内容主要讲解“Java程序的运行过程是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Java程序的运行过程是什么”吧!Java程序运行过程运行一个Java程序的步骤编辑源代码xxx.ja...
    99+
    2023-07-05
  • java程序的编译过程是什么
    Java程序的编译过程分为以下几个步骤:1. 编写源代码:首先需要编写Java程序的源代码,源代码是以.java文件的形式存在,可以...
    99+
    2023-09-28
    java
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作