首页 > 其他分享 >缺乏底层知识的空中楼阁之——HashMap

缺乏底层知识的空中楼阁之——HashMap

时间:2023-11-10 11:16:06浏览次数:33  
标签:Node hash HashMap 16 hashCode key 空中楼阁 底层

HashMap

HashMap是基于哈希表对Map接口的实现

HashMap提供所有可选的映射操作,允许使用空键空值 new HashMap<>().put(null,null)

当存在多个线程同时写入HashMap时,可能会导致数据的不一致

 

HashMap的底层实现:

 

loadFactor threshold size modCount INITLAL_CAPACITY

HashMap的存储结构:数组+链表+红黑树(jdk 1.8)

 

 

  

每个Node节点存储着用来定位数据索引位置的hash值,k键,v值以及指向链表下一个节点的Node<k,v> next节点组成

static class Node<K,V> implements Map.Entry<K,V> {
   final int hash;
   final K key;
   V value;
   Node<K,V> next;
}

Node是HashMap的内部类,实现了Map.Entry接口,本质是一个键值对

 

如何确定Node的存储位置?

以添加Key键为字符'e'为例:

static final int hash(Object key){
   int h;
   return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);
}

HashMap首先调用hashCode() 方法,获取键key的hashCode值h(101),然后对其进行高位运算:

将右移16位以取得h的高16位,与原h的低16位进行异或运算 (结果为101)

最后将得到的h值与 (table.length - 1) 进行与运算获得该对象的保留位以计算下标

 

标签:Node,hash,HashMap,16,hashCode,key,空中楼阁,底层
From: https://www.cnblogs.com/legends-61/p/17823613.html

相关文章

  • 标题:Dubbo RPC开发中的序列化问题:深度解析反序列化导致的HashMap异常
    DubboRPC开发中的序列化问题:深度解析反序列化导致的HashMap异常在使用DubboRPC进行开发时,我们可能会遇到一些出乎意料的问题。其中之一就是在进行远程调用时,内部嵌套对象出现与预期不符的HashMap。这个问题的根源在于反序列化过程中找不到对象,导致解析成了HashMap。在这篇博客......
  • 开发时推荐使用Map map = new HashMap()
    Mapmap=newHashMap();Map是一个接口,HashMap是具体的实现类。由于接口就是多个类的共有规范(里面的抽象方法),是一种引用数据类型,一个抽象的概念,不能被实例化,因此接口需要由具体的类来实现。这条代码指明:由HashMap类来实现接口Map中描述的方法。HashMapmap=newHashMap(......
  • HashMap、TreeMap、Hashtable、HashSet和ConcurrentHashMap区别
    一、HashMap和TreeMap区别1、HashMap是基于散列表实现的,时间复杂度平均能达到O(1)。   TreeMap基于红黑树(一种自平衡二叉查找树)实现的,时间复杂度平均能达到O(logn)。2、HashMap、TreeMap都继承AbstractMap抽象类;TreeMap实现SortedMap接口,所以TreeMap是有序的!HashMap是无序的......
  • HashMap---jdk8
    概述HashtablebasedimplementationoftheMapinterface.Thisimplementationprovidesalloftheoptionalmapoperations,andpermits<tt>null</tt>valuesandthe<tt>null</tt>key.(The<tt>HashMap</tt>classis......
  • hashmap的小应用---投票去旅游
    在学习了map之后,使用简单的hashmap进行简单的全班同学投票旅游地点packagecom.itheima.myMap;importjava.util.*;importjava.util.function.BiConsumer;publicclassText2{publicstaticvoidmain(String[]args){//模拟投票Randomra=newRandom......
  • 通关Go语言,从基本原理到项目实战,由浅入深Go的底层原理与核心特性
    通关Go语言,从基本原理到项目实战,由浅入深Go的底层原理与核心特性go核心原理本人在一家go技术栈工作2年有余,因此梳理一下我认为比较重要的go语言技术知识,一些基础的概念,比如function,interface这些就忽略了。https://draveness.me/golang/https://www.bookstack.cn/read/qcr......
  • LinkedHashMap
    概述Hashtableandlinkedlistimplementationofthe<tt>Map</tt>interface,withpredictableiterationorder.Thisimplementationdiffersfrom<tt>HashMap</tt>inthatitmaintainsadoubly-linkedlistrunningthroughallofitsen......
  • 大模型训练对底层模型的影响及优化策略
    在深度学习和人工智能领域,模型训练是实现算法和应用的关键步骤。然而,对于大型模型训练,人们普遍关注其性能和精度,而忽略了对底层模型的影响。本文将探讨“大模型训练会影响底模型吗”这一话题,分析可能的影响及应对策略。一、大模型训练对底层模型的影响计算资源占用大型模型训练需要......
  • HashMap源码详解
    HashMap简介HashMap是Java语言中的一种集合类,它实现了Map接口,用于存储Key-Value对。它基于哈希表数据结构,通过计算Key的哈希值来快速定位Value的位置,从而实现高效的插入、删除和查找操作。下面我们对照着JAVA1.8中的HashMap源码来分析一下它的内部实现逻辑基本的结构在开始分析......
  • HashMap的长度是2的幂次方
    为了能让HashMap存取高效,尽量减少碰撞,也就是要尽量把数据分配均匀。Hash值的范围值-2147483648到2147483647,前后加起来大概40亿的映射长度,只要哈希函数映射的比较均匀松散,一般应用是很难出现碰撞的。但问题是一个40亿长度的数组,内存是放不下的。所以这个散列值是不能直接拿来用的。......