深入解析HashMap的put方法

目录
  • 一.创建
  • 二.put()
  • 三.数组初始化
  • 四.扩容

一.创建

这个相信大家也都知道怎么使用。今天就深入理解一下这里的底层原理。 首先HashMap在java中,创建出来是一个数组,然后数组上存放的元素是一个链表。

二.put()

进入底层源码看一下。

HashMap,在添加第一个元素的时候创建一个默认2的幂的数组。也就是16,这个参数也可以你自己设置。但是一定是2的幂,假如new HashMap(30),那么只会创建一个32大小的数组。

计算出元素的hashcode,放到指定位置,看数组中是否有元素,无元素直接放到数组元素上,有元素的话则进行(jdk1.8)尾插。

当一个数组元素下的链表长度超过8,就会触发treeifyBin(),

但是必须满足,数组的长度大于64,否则,只是就行resize()扩容,重新hash。 如果满足链表长度大于8,并且数组长度大于64,此时就把链表转换成红黑树(一种比较平衡的二叉搜索树)。 着里再讲一个设计remove()删除元素,当红黑树里的元素被删除到小于8的时候怎么办?其实这里有个过渡,不是8,而是如果红黑树里的元素删除的小于6的时候就会触发收缩检测。

此时就会红黑树收缩回链表了。

三.数组初始化

前面 put里提到过,初始new HashMap() 默认大小是16,可以指定数组大小,但是一定是2的幂。如 new HashMap(30),那么数组的大小就为32了。这个都很好理解。

四.扩容

负载因子 = 添加的元素 / hash表的长度

这个值默认是 0.75 ( jdk1.8)(可以根据实际需求调整,当值越大hash冲突概率就高,查询效率低,节省了空间,反之相反),当超过0.75,就会触发resize(),进行数组的扩容。

到此这篇关于深入解析HashMap的put方法的文章就介绍到这了,更多相关HashMap put方法内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 解析HashMap中的put方法执行流程

    目录 引言 HashMap底层数据结构 put方法的执行流程 总结 引言 在Java集合中,HashMap的重要性不言而喻,作为一种存储键值对的数据结构,它在日常开发中有着非常多的应用场景,也是面试中的高频考点,本篇文章就来分析一下HashMap集合中的put方法. HashMap底层数据结构 先来了解一下HashMap底层的数据结构,它实质上是一个散列表,在数据结构课程中,我们应该都学习过散列表,它是通过关键码值而直接进行访问的一种数据结构,比如存储这样的一个序列:5,12,7,6,1,3.我

  • Java源码解析之HashMap的put、resize方法详解

    一.HashMap 简介 HashMap 底层采用哈希表结构 数组加链表加红黑树实现,允许储存null键和null值 数组优点:通过数组下标可以快速实现对数组元素的访问,效率高 链表优点:插入或删除数据不需要移动元素,只需要修改节点引用效率高 二.源码分析 2.1 继承和实现 public class HashMap<K,V> extends AbstractMap<K,V> implements Map<K,V>, Cloneable, Serializable {

  • 基于Java并发容器ConcurrentHashMap#put方法解析

    jdk1.7.0_79 HashMap可以说是每个Java程序员用的最多的数据结构之一了,无处不见它的身影.关于HashMap,通常也能说出它不是线程安全的.这篇文章要提到的是在多线程并发环境下的HashMap--ConcurrentHashMap,显然它必然是线程安全的,同样我们不可避免的要讨论散列表,以及它是如何实现线程安全的,它的效率又是怎样的,因为对于映射容器还有一个Hashtable也是线程安全的但它似乎只出现在笔试.面试题里,在现实编码中它已经基本被遗弃. 关于HashMap的线程不

  • HashMap原理及put方法与get方法的调用过程

    HashMap的原理 HashMap的数据结构为数组+链表,以key,value的形式存值,通过调用put与get方法来存值与取值. 它内部维护了一个Entry数组,得到key的hashCode值将其移位按位与运算,然后再通过跟数组的长度-1作逻辑与运算得到一个index值来确定数据存储在Entry数组当中的位置,通过链表来解决hash冲突问题. 当发生碰撞了,对象将会储存在链表的下一个节点中. HashMap底层原理(当你put,get时内部会发生什么呢?) 接触过HashMap的小伙伴都会经

  • 深入解析HashMap的put方法

    目录 一.创建 二.put() 三.数组初始化 四.扩容 一.创建 这个相信大家也都知道怎么使用.今天就深入理解一下这里的底层原理. 首先HashMap在java中,创建出来是一个数组,然后数组上存放的元素是一个链表. 二.put() 进入底层源码看一下. HashMap,在添加第一个元素的时候创建一个默认2的幂的数组.也就是16,这个参数也可以你自己设置.但是一定是2的幂,假如new HashMap(30),那么只会创建一个32大小的数组. 计算出元素的hashcode,放到指定位置,看数组中

  • Java源码解析HashMap的keySet()方法

    HashMap的keySet()方法比较简单,作用是获取HashMap中的key的集合.虽然这个方法十分简单,似乎没有什么可供分析的,但真正看了源码,发现自己还是有很多不懂的地方.下面是keySet的代码. public Set<K> keySet() { Set<K> ks = keySet; if (ks == null) { ks = new KeySet(); keySet = ks; } return ks; } 从代码中了解到,第一次调用keySet方法时,keySet

  • Android开发之利用jsoup解析HTML页面的方法

    本文实例讲述了Android利用jsoup解析HTML页面的方法.分享给大家供大家参考,具体如下: 这节主要是讲解jsoup解析HTML页面.由于在android开发过程中,不可避免的涉及到web页面的抓取,解析,展示等等,所以,在这里我主要展示下利用jsoup jar包来抓取cnbeta.com网站的话题分类的实例. 下面是主要的代码,由于使用及其简单,我这里就不再多说了: package com.android.web; import java.io.BufferedInputStream;

  • java解析Excel文件的方法实例详解

    目录 介绍 1.1 pom依赖 1.2 将数据流转化为可解析的Workbook类型文件 1.3 解析 1.4 Controller层接收前端传递的Excel文件(前端使用Element-ui的<el-upload>组件) 1.5 ServiceIMPL层解析Excel文件并将解析结果返回 1.6 前端VUE实现Excel文件的上传(使用Element-ui的<el-upload>组件) 总结 在做一个项目时,有很多原本保存在Excel文件中的基础数据,如此则需要一个Excel文件解

  • Delphi解析FTP地址的方法

    本文实例讲述了Delphi解析FTP地址的方法.分享给大家供大家参考.具体实现方法如下: procedure TForm1.FTPAnalysis(S:string;var UserName,Password,IP,FileName:String;var DirList:TStringList); var i,j:integer; strAuthorization,strAddr,strDirFile:string; //授权信息 begin UserName:= 'anonymous'; Pa

  • Android pull解析xml的实现方法

    Android pull解析xml的实现方法 资源文件: persons.xml <?xml version="1.0" encoding="utf-8" standalone="yes" ?> <persons> <person id="101"> <name>jame</name> <age>18</age> </person>

  • java简单解析xls文件的方法示例【读取和写入】

    本文实例讲述了java简单解析xls文件的方法.分享给大家供大家参考,具体如下: 读取: import java.io.*; import jxl.*; import jxl.write.*; import jxl.format.*; class Aa{ public static void main(String args[]) { try{ Workbook workbook = null; try { workbook = Workbook.getWorkbook(new File("d:

  • springboot实现FastJson解析json数据的方法

    最近在研究springboot实现FastJson解析json数据的方法,那么今天也算个学习笔记吧! 添加jar包: <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.15</version> </dependency> 两种方式启动加载类: 第一种继承WebMvcConfigur

  • 详解Swift model 解析的两种方法

    详解Swift model 解析的两种方法 1. 常规解析方法 //懒加载声明一个LJNewsModel为数据的数组 lazy var ljArray : [LJNewsModel] = [LJNewsModel]() //MARK:-- 数据获取和解析 extension NewsViewController{ func requestNetData(){ /* 打印json数据 */ LJDownLoadNetImage.request("GET", url: "http

随机推荐