广告
返回顶部
首页 > 资讯 > 后端开发 > Python >Java集合-HashMap
  • 315
分享到

Java集合-HashMap

2024-04-02 19:04:59 315人浏览 泡泡鱼

Python 官方文档:入门教程 => 点击学习

摘要

目录概述重要的参数put函数的实现get函数的实现hash函数的实现RESIZE的实现概述 ①以数组+链表+红黑树实现。主要用来处理具有键值对特征的数据。②当链表长度大于阈值(或者红

概述

以数组+链表+红黑树实现。主要用来处理具有键值对特征的数据。
②当链表长度大于阈值(或者红黑树的边界值,默认为 8 )并且当前数组的长度大于 64 时,此时此索引位置上的所有数据改为使用红黑树存储。
补充:链表转换成红黑树前会判断,即便阈值大于 8,但是数组长度小于 64,此时并不会将链表变为红黑树,而是选择逬行数组扩容。
④每个node节点存储着用来定位数据索引位置的hash值,K键,V值以及指向链表下一个节点的Node<K,V> next节点组成。
⑤Node是HashMap的内部类,实现了Map.Entry接口,本质是一个键值对。
⑥这样做的目的是因为数组比较小,尽量避开红黑树结构,这种情况下变为红黑树结构,反而会降低效率,因为红黑树需要逬行左旋,右旋,变色这些操作来保持平衡。同时数组长度小于64时,搜索时间相对要快些。所以结上所述为了提高性能和减少搜索时间,底层阈值大于8并且数组长度大于64时,链表才转换为红黑树。

重要的参数

①容量(Capacity)和负载因子(Load factor
②初始容量:容量是哈希表中桶的个数,初始容量是创建哈希表时的容量。
③负载因子:负载因子是衡量哈希表在自动增加容量之前允许其达到多满的指标。 默认0.75
④threshold:threshold表示所能容纳的键值对的临界值。计算公式为 数组长度 * 负载因子。
⑤size:size是hashmap中实际存在的键值对数量。
⑥modCount:用来记录hashmap内部结构发生变化的次数。

put函数的实现

大致思路:

对key的hashCode()做hash,然后再计算index;
如果没碰撞直接放到bucket里;
如果碰撞了,以链表的形式存在buckets后;
如果碰撞导致链表过长(大于等于 TREEIFY_THRESHOLD )就把链表转换成红黑树;
如果节点已经存在就替换old value(保证key的唯一性)
如果bucket满了(超过 load factor*current capacity ),就要resize(调整大小)。

get函数的实现

大致思路:

  • bucket里的第一个节点,直接命中;
  • 如果有冲突,则通过key.equals(k)去查找对应的entry若为树,则在树中通过key.equals(k)查找,O(logn);若为链表,则在链表中通过key.equals(k)查找,O(n)。

hash函数的实现

//高16bit不变,低16bit和高16bit做了一个异或
static final int hash(Object key) {
    int h;
    return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);
}

获取HashMap的元素时,基本分两步:

  • 1.首先根据hashCode()做hash,然后确定bucket的index;
  • 2.如果bucket的节点的key不是我们需要的,则通过keys.equals()在链表(红黑树)中找。

RESIZE的实现

当put时,如果发现目前的bucket占用程度已经超过了Load Factor所希望的比例,那么就会发生resize。

resize的过程,简单的说就是把bucket扩充为2倍,之后重
新计算index,把节点再放到新的bucket中。元素的位置要么是在原位置,要么是在原位置再移动2次幂的位置。省去了重新计算hash值的时间,把之前的冲突的节点分散到新的bucket了

什么时候会使用HashMap?他有什么特点?

是基于Map接口的实现,存储键值对时,它可以接收null的键值,是非同步的,HashMap存储着Entry(hash, key, value, next)对象。
** 你知道HashMap的工作原理吗?**
通过hash的方法,通过put和get存储和获取对象。存储对象时,我们将K/V传给put方法时,它调用hashCode计算hash从而得到bucket位置,进一步存储,HashMapJava集合——HashMap会根据当前bucket的占用情况自动调整容量(超过 Load Facotr 则resize为原来的2倍)。获取对象时,我们将K传给get,它调用hashCode计算hash从而得到bucket位置,并进一步调用equals()方法确定键值对。如果发生碰撞的时候,Hashmap通过链表将产生碰撞冲突的元素组织起来,在Java 8中,如果一个bucket中碰撞冲突的元素超过某个限制(默认是8),则使用红黑树来替换链表,从而提高速度。

你知道get和put的原理吗?equals()和hashCode()的都有什么作用?

通过对key的hashCode()进行hashing,并计算下标( (n-1) & hash ),从而获得buckets的位置。如果产生碰撞,则利用key.equals()方法去链表或树中去查找对应的节点。

hash的实现,为什么要这样实现?

在Java 1.8的实现中,是通过hashCode()的高16位异或低16位实现的: (h =k.hashCode()) ^ (h >>> 16) ,主要是从速度、功效、质量来考虑的,这么做可以在bucket的n比较小的时候,也能保证考虑到高低bit都参与到hash的计算中,同时不会有太大的开销。

如果HashMap的大小超过了负载因子( load factor )定义的容量,怎么办?

如果超过了负载因子(默认0.75),则会重新resize一个原来长度两倍的HashMap,并且重新调用hash方法。

到此这篇关于Java集合-HashMap的文章就介绍到这了,更多相关Java集合HashMap内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: Java集合-HashMap

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

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

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

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

下载Word文档
猜你喜欢
  • Java集合-HashMap
    目录概述重要的参数put函数的实现get函数的实现hash函数的实现RESIZE的实现概述 ①以数组+链表+红黑树实现。主要用来处理具有键值对特征的数据。②当链表长度大于阈值(或者红...
    99+
    2022-11-12
  • java集合类HashMap源码解析
    目录Map集合HashMap源码分析1、存储结构2、拉链法的工作原理3、put()方法4、确定桶下标4.1、确定hash值4.2、取模确定桶下标5、扩容原理6、扩容-重新计算桶下标7...
    99+
    2022-11-12
  • Java 详解Map集合之HashMap和TreeMap
    目录HashMap创建HashMap添加元素访问元素删除元素TreeMap创建TreeMap添加元素访问元素删除元素HashMap、TreeMap区别 Map接口储存一组成对的键-值...
    99+
    2022-11-13
  • Java的集合函数HashMap怎么用
    本篇内容介绍了“Java的集合函数HashMap怎么用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!概述①以数组+链表+红黑树实现。主要用来...
    99+
    2023-06-26
  • Java集合HashMap的知识点详解
    这篇文章主要讲解了“Java集合HashMap的知识点详解”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Java集合HashMap的知识点详解”吧!一、什么是哈希表在讨论哈希表之前,我们先大...
    99+
    2023-06-02
  • Java中HashMap集合的常用方法详解
    目录public Object clone()总结public Object clone() 返回hashMap集合的副本   其余的方法都是实现Map...
    99+
    2022-11-12
  • 分析Java中HashMap集合的常用方法
    这篇文章主要介绍“分析Java中HashMap集合的常用方法”,在日常操作中,相信很多人在分析Java中HashMap集合的常用方法问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”分析Java中HashMap集...
    99+
    2023-06-25
  • 利用Java如何实现对HashMap的集合使用
    这期内容当中小编将会给大家带来有关利用Java如何实现对HashMap的集合使用,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。HashMap是最常用的Map集合,它的键值对在存储时要根据键的哈希码来确定值...
    99+
    2023-05-31
    java 集合 hashmap
  • 入门JDK集合之HashMap解析
    目录1.HashMap存储数据的过程 2.HashMap相关面试题3.HashMap继承体系4.HashMap基本属性与常量4.1 DEFAULT_INITIAL_CAPACITY4...
    99+
    2022-11-12
  • 【HashMap】| 深度剥析Java SE 源码合集Ⅱ | 你会吗?
    目录 一. 🦁 HashMap介绍1.1 特点1.2 底层实现 二. 🦁 结构以及对应方法分析2.1 结构组成2.1.1 成员变量2.1.2 存储元素的节点...
    99+
    2023-09-06
    java 链表 数据结构 哈希算法 面试
  • Java案例之HashMap集合存储学生对象并遍历
    一、需求:创建一个HashMap集合,键是学号(String),值是学生对象(Student),存储三个键值对元素,并遍历 分析: 1.定义学生类2.创建HashMap集合对象3.创...
    99+
    2022-11-13
  • Map集合之HashMap的使用及说明
    目录HashMap 概述jdk 1.8 之前与之后的 HashMapHashMap 的数组,链表,红黑树之间的转换HashMap 扩容机制HashMap 源码HashMap 的基本属...
    99+
    2022-11-13
    Map集合 HashMap的使用 Map集合HashMap
  • Java的HashMap集合存储学生对象并遍历的方法
    这篇文章主要讲解了“Java的HashMap集合存储学生对象并遍历的方法”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Java的HashMap集合存储学生对象并遍历的方法”吧!一、需求:创建...
    99+
    2023-06-29
  • Java List 集合取 交集、并集、差集、补集 Java集合取交集、Java集合并集
            Java List 集合取 交集、并集、差集、补集 Java集合取交集、Java集合并集 一、概述         1、在日常开发中:       经常会遇到对2个集合的操作,例如:2个集合之间取相同的元素(交集),2个集...
    99+
    2023-08-31
    Java List集合交集 Java List集合并集 Java List集合交集差集 List 集合交易 并集 List集合补集差集
  • Java集合-List
    一、List集合概述 java.util.List接口继承自Collection接口,是单列集合的一个重要分支,习惯性地会将实现了List接口的对象称为List集合,在List集合中允许出现重复的...
    99+
    2023-09-07
    java list 数据结构 算法 开发语言
  • Java HashMap透析
    HashMap 是数组和链表组合组成的复杂结构,哈希值决定了键值在数组的位置,当哈希值相同时则以链表形式存储,当链表长度到达设定的阈值则会对其进行树化,这样做是为了保证数据安全和数据相关操作的效率HashMap 性能表现取决于哈希码的有效性...
    99+
    2021-08-10
    java教程 Java
  • java中的集合
    1.集合概述 Java的集合框架是由很多接口、抽象类、具体类组成的,都位于java.util包中。 2.Collection接口 Collection 接口-定义了存取一组对象的方法,其子接口Set和List分别定义了存储方式。Set 中...
    99+
    2023-09-04
    java jvm 开发语言
  • 【Java】求两集合的交集、并集、差集
    一、内置函数实现 1、removeAll方法:从list中删除指定集合中包含的所有元素。 2、retainAll方法:从list中删除指定集合中不包含的所有元素。 3、addAll方法:用来向Set集合添加另一个集合对象所包含的所有内容。 ...
    99+
    2023-08-18
    java
  • Java 中HashMap 详解
    本篇重点: HashMap的存储结构 HashMap的put和get操作过程 HashMap的扩容 关于transient关键字 HashMap的存储结构 HashMap 总体是数组+链表的存储结构, 从JDK1.8开始,当数组的长度大...
    99+
    2023-09-03
    哈希算法 散列表 java
  • Java集合系列之JCF集合框架概述
    Java集合框架(Java Collections Framework,JCF)是Java平台提供的一套用于存储、操作和管理对象的集...
    99+
    2023-09-23
    java
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作