HashMap原理

Remosaic 算法 在 4in1 传感器中,相邻的 4 个同色像素(如 4 个红色、绿色或蓝色像素)合并为 1 个“超级像素”,以提升低光环境下的感光能力。例如,在 RGGB 排列中,每个 2x2 的 Quad 单元需要恢复为 4 个独立的 R、Gr、Gb、B 像素1。:传感器通过硬件级 Remosaic 直接输出 4800 万像素的原始数据,每个像素独立记录颜色信息,解析力更高2。:传感器仅输出 1200 万像素数据,再通过软件算法插值放大到 4800 万像素,实际解析力无本质提升2。的原始数据转换为传统。 阅读详情

java HashMap 详解

了解HashMap之前,先来了解下hash算法

Hash算法

  按我的理解,hash算法相当于对一个值进行某种运算,可以生成一个与这个值对应的“唯一”标识,这个生成的过程是可预估时间的,但是逆向这个过程较为困难,且很难找到不同值生成的两个标识相同,这个过程就叫做hash算法。

  例如,有一万个文件,你想确认一个文件在不在一万个文件里,一一比对每个文件内容速度会很慢,如果对每个文件根据内容都生成一个唯一标识,那么只要比对这个标识是否重复就可以判断出来了。

  hash算法在HashMap中的主要应用就是针对key生成一个唯一值,尽可能的让键值对分配到不同的桶中

HashMap 是什么

HashMap 是基于哈希表的 Map 接口的非同步实现。此实现提供所有可选的映射操作,并允许使用 null 值和 null 键。此类不保证映射的顺序,特别是它不保证该顺序恒久不变。

HashMap 是非线程安全的。

HashMap 是数组和链表的结合体,发生碰撞时,在该位置加一个链表。数据结构如下:

通过查看HashMap源码,在构造函数中,会创建一个Entry数组,Entry结构如下:

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

Entry 是一个 static class,其中包含了 key 和 value,也就是键值对,另外还包含了一个 next 的 Entry 指针。我们可以总结出:Entry 就是数组中的元素,每个 Entry 其实就是一个 key-value 对,它持有一个指向下一个元素的引用,这就构成了链表。

 

HashMap 的存储机制

当系统决定存储 HashMap 中的 key-value 对时,完全没有考虑 Entry 中的 value,仅仅只是根据 key 来计算并决定每个 Entry 的存储位置。我们完全可以把 Map 集合中的 value 当成 key 的附属,当系统决定了 key 的存储位置之后,value 随之保存在那里即可。

hash(int h)方法根据 key 的 hashCode 重新计算一次散列。此算法加入了高位计算,防止低位不变,高位变化时,造成的 hash 冲突。

根据计算出的hash值分别存入不同的桶中,如果计算出的hash值相同,意味着发生碰撞,当我们往 HashMap 中 put 元素的时候,先根据 key 的 hashCode 重新计算 hash 值,根据 hash 值得到这个元素在数组中的位置(即下标),如果数组该位置上已经存放有其他元素了,那么在这个位置上的元素将以链表的形式存放,新加入的放在链头,最先加入的放在链尾。如果数组该位置上没有元素,就直接将该元素放到此数组中的该位置上。

举个例子,有两个桶,一个装的是水果,一个装的是蔬菜,你要找到特定的水果或者蔬菜,要先找到对应的桶,再去桶里逐个寻找你要的水果或者蔬菜,但是分类更细的话,每种水果和每种蔬菜都各占一个桶,你只要找对应的桶就可以找到你要的,是一种拿空间换时间的做法。至于多少个桶,没有固定的要求。

HashMap的长度为什么是2的n次方

有两点原因

1. 通过查看源码,计算某个键值对应该保存的位置的时候时,使用的indexFor方法代码如下:

/**
     * Returns index for hash code h.
     */
static int indexFor(int h, int length) {  
    return h & (length-1);
}

使用的  & 即按位与运算

假设数组长度分别为 15 和 16,优化后的 hash 码分别为 8 和 9,那么 & 运算后的结果如下:

h & (table.length-1)hash table.length-1 
8 & (15-1):0100&1110= 0100
9 & (15-1):0101&1110= 0100
8 & (16-1):0100&1111= 0100
9 & (16-1):0101&1111= 0101

2n-1 得到的二进制数的每个位上的值都为 1,这使得在低位上&时,得到的和原 hash 的低位相同,加之 hash(int h)方法对 key 的 hashCode 的进一步优化,加入了高位计算,就使得只有相同的 hash 值的两个值才会被放到数组中的同一个位置上形成链表。而15的后一位为0,导致数组空间浪费,而且增加碰撞几率,使得查询效率变低。

所以说当数组长度为2的次幂的时候,不同的key hash运算得到的结果相同的几率很小,使得数组分布较为均匀,碰撞的概率也变小了,从而查询的时候无需遍历数组某个位置的链表,提升查询效率。

2.长度为2的n次幂,可以使用效率较高的位移运算符 ">>"

HashMap 的性能参数

当HashMap中的数据越来越多时,发生碰撞的概率也越来越搞,这个时候会对数据进行扩容,默认长度为16,负载因子为0.75,也就是数据数目达到两者乘积也就是16*0.75=12时,数组会扩容为原来的两倍,2*16=32。这个扩容操作叫做rehash,因为要对原先所有数据重新计算位置,再放入扩容后的数组中,所以如果可以确定数组长度的话,提前设置好长度,可以减少性能消耗。

HashMap 包含如下几个构造器:

  • HashMap():构建一个初始容量为 16,负载因子为 0.75 的 HashMap。
  • HashMap(int initialCapacity):构建一个初始容量为 initialCapacity,负载因子为 0.75 的 HashMap。
  • HashMap(int initialCapacity, float loadFactor):以指定初始容量、指定的负载因子创建一个 HashMap。

HashMap 的基础构造器 HashMap(int initialCapacity, float loadFactor) 带有两个参数,它们是初始容量 initialCapacity 和负载因子 loadFactor。

负载因子 loadFactor 衡量的是一个散列表的空间的使用程度,负载因子越大表示散列表的装填程度越高,反之愈小。对于使用链表法的散列表来说,查找一个元素的平均时间是 O(1+a),因此如果负载因子越大,对空间的利用更充分,然而后果是查找效率的降低;如果负载因子太小,那么散列表的数据将过于稀疏,对空间造成严重浪费。

HashMap 的实现中,通过 threshold 字段来判断 HashMap 的最大容量:

        threshold = (int)(capacity * loadFactor);

结合负载因子的定义公式可知,threshold 就是在此 loadFactor 和 capacity 对应下允许的最大元素数目,超过这个数目就重新 resize,以降低实际的负载因子。默认的的负载因子 0.75 是对空间和时间效率的一个平衡选择。当容量超出此最大容量时, resize 后的 HashMap 容量是容量的两倍:

HashMap是否是线程安全的

HashMap是非线程安全的,当对其进行遍历的时候,如果其他线程修改了map,那么会报ConcurrentModificationException,这个是通过modCount 域实现的,类似计数器,迭代器初始化的时候会得到这个值,每次迭代去比较值是否发生了变化,如果有变化,则抛出异常,这个机制叫fail-fast 机制,是一种错误检测机制。它只能被用来检测错误,因为 JDK 并不保证 fail-fast 机制一定会发生。若在多线程环境下使用 fail-fast 机制的集合,建议使用“java.util.concurrent 包下的类”去取代“java.util 包下的类”。

ConcurrentHashMap

 

本篇内容主要参考该文章

http://wiki.jikexueyuan.com/project/java-collection/hashmap.html 

针对性的对部分内容举例说明

 

 

第14.10章 高翔博士最新开源框架Lightning-LM源码解读(十):在线定位run_loc_online涉及到的核心模块总结 本文对Lightning-LM激光SLAM定位框架进行了全面剖析。该框架是一个轻量高效的激光雷达建图与定位系统,支持3D SLAM、动态图层管理等功能。文章首先介绍了项目概况和源码结构,包括核心模块如定位系统(loc_system)、激光匹配(lidar_loc)和位姿图优化(pose_graph)等。接着详细解析了各模块的关键函数和运行流程,如数据接收处理、NDT匹配和位姿优化等。最后总结了学习该框架所需的C++知识要点,包括智能指针、多线程编程等现代C++特性。该分析为SLAM开发者提供了实用的架构参考 阅读详情

相关推荐

STRING数据库的蛋白质相互作用(PPI)网络分析

在转录调控相关的文献中,我们经常能够看到这样的蛋白质相互作用网络(protein protein interaction network,PPI network)。具体而言,这些相关的文献中首先通过RNA-seq、表达谱芯片或者蛋白质组分析等,找到了在不同分组样本间一系列的差异表达基因或蛋白。

weixin_43029125的博客 9458

总结HashMap实现原理分析

一、底层数据结构 在JDK1.6,JDK1.7中,HashMap采用位桶+链表实现,即使用链表处理冲突,同一hash值的键值对会被放在同一个位桶里,当桶中元素较多时,通过key值查找的效率较低。 而JDK1.8中,HashMap采用位桶+链表+红黑树实现,当链表长度超过阈值(8),时,将链表转换为红黑树,这样大大减少了查找时间。 二、HashMap的实现原理: JDK1.7中的Ha...

洞玄之境的博客 2万+

机械臂抓取前言

机械臂相关的笔记

weixin_64037619的博客 3908

java基础:HashMap原理

HashMap底层原理:大结构主要使用数组,链表,红黑树(jdk1.8新加)。数组与链表的结合叫哈希表 ,有兴趣的小伙伴可以看数据结构,有详细介绍。 数组:存储的数据是连续的,每一条数据有对应的下标(也即索引),多条数据在数组中,下标是连续的,也即内存地址是连续的,优点是节约空间(也即内存),查询效率高,想象一下图书馆整齐排列的书籍,我们通过检索(相对应数组中的下标)就可以得到相应是书籍,缺点是...

qq_41866772的博客 220

Windows下Delft3D安装全攻略:从申请许可到编译运行(避坑指南)

本文详细解析了Windows系统下Delft3D的完整安装流程,涵盖环境准备、许可获取、源码编译到性能调优的全过程。针对中国用户常见的网络问题和系统兼容性痛点,提供了经过验证的解决方案,特别强调Intel Fortran编译器匹配、环境变量配置等关键步骤,帮助水利工程师高效完成这一水动力学模拟工具的部署。

weixin_28736355的博客 550

EtherCAT主站SOEM -- 15 -- CIA402伺服驱动器子协议

以上就是EtherCAT主站SOEM – 15 – CIA402伺服驱动器子协议的内容。有不明白的地方欢迎留言;有建议欢迎留言,我后面编写文档好改进。创作不容,如果文档对您有帮助,记得给个赞。

常驻客栈的博客--嵌入式EtherCAT 2733

HashMap原理详解

hashmap简介

稚彦的博客 1万+

uboot引导vxworks6.9(T4240) 启动

vxworks内核配置下搜索RAM_LOW_ADRS, 值为0x01000000, 是vxworks下载启动的地址,uboot启动时会用到。vxworks6.9 t4240用的是32地址空间,uboot下用的是64位地址空间,去uboot下修改law物理地址空间为32位。vxworks下flash基地址为 0xff000000, 将vx下的地址修改为0xe0000000,和uboot下地址一致。uboot下flash基地址为0xe000000,vxworks内核配置为build-in 符号表。

珂珂可爱多 3236

hashMap原理

HashMap原理 hashMap底层由哈希表构成。 在jdk1.8中 hashMap由数组+链表+红黑树构成 在介绍HashMap之前,有必要知道 1、什么hash Hash,一般翻译为“散列”,也有直接音译为“哈希”的,这就是把任意长度的输入通过散列算法,变换成固定长度的输出,该输出就是散列值(哈希值);这种转换是一种压缩映射,也就是,散列值的空间通常远小于输入的空间,不同的输入可能会散列成相同的输出,所以不可能从散列值来唯一的确定输入值。简单的说就是一种将任意长度的消息压缩到某一固定长度的消息摘要的

白鸽 973

使用 MATLAB/Simulink + Simscape Electrical + Simulink Design Optimization,构建一个沙漠环境中光伏组件灰尘积累与效率下降仿真模型

本文通过,构建了沙漠环境中光伏组件灰尘积累与效率下降仿真模型✅ 建立了风速-沙尘-积尘速率的物理关系✅ 仿真了灰尘积累过程及其对Isc 和 Pmax的影响✅ 量化分析了不同清洁策略的经济性✅ 提出了优化设计与智能运维建议。

xiaoheshang_123的博客 123

Python 爬虫实战:arXiv 学术论文 PDF 批量下载(含反爬策略与文件命名规范)

arXiv 是全球最大的免费开放预印本论文平台之一,涵盖物理学、数学、计算机科学等多个学科领域。研究人员、学生和工程师常常需要批量下载论文 PDF 进行文献综述、构建机器学习数据集或进行文本挖掘研究。然而,手动逐篇下载论文效率低下,因此开发一个自动化批量下载工具显得尤为重要。

yansideyucsdn的博客 1818

HashMap的基本原理

一、HashMap原理 1.1 HashMap特性?   HashMap的特性:HashMap存储键值对,实现快速存取数据;允许null键/值;非同步;线程不安全;不保证有序(比如插入的顺序)。实现Map接口。HashTaber 是线程安全的。 HashMap数据结构:数组+链表。 HashMap里面有一个数组Node&lt;K,V&gt;[] 默认长度为16。存储的是K、V、next(No...

Lonely passerby 6117

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

HashMap底层实现原理解析

一:HashMap底层实现原理解析 我们常见的有数据结构有三种结构:1、数组结构 2、链表结构 3、哈希表结构 下面我们来看看各自的数据结构的特点: 1、数组结构: 存储区间连续、内存占用严重、空间复杂度大 优点:随机读取和修改效率高,原因是数组是连续的(随机访问性强,查找速度快) 缺点:插入和删除数据效率低,因插入数据,这个位置后面的数据在内存中都要往后移动,且大小固定不易动态扩展。 2、链表结构:存储区间离散、占用内存宽松、空间复杂度小 优点:插入删除速度快,内存利用率高,没有固定大小,扩展灵活

qq_43370771的博客 12万+

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

HashMap底层原理

1、哈希映射:通过哈希函数计算键的哈希值,并决定存储位置。2、链表和红黑树:用于解决哈希冲突,链表长度超过阈值时转化为红黑树。3、扩容和再散列:当元素数量超过一定阈值时,数组扩容,并重新分配元素的位置。

qq_45737165的博客 7122

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

HashMap底层实现原理

HashMap实现原理 1.概述 HashMap是基于哈希表的Map接口的非同步实现。元素以键值对的形式存放,并且允许null键和null值,因为key值唯一(不能重复),因此,null键只有一个。另外,hashmap不保证元素存储的顺序,是一种无序的,和放入的顺序并不相同(此类不保证映射的顺序,特别是它不保证该顺序恒久不变)。HashMap是线程不安全的。 2.继承关系 public class HashMap<K,V> extends AbstractMap<K,V> i

fengxi_tan的博客 2万+

hashmap 的原理

本文转载自https://blog.youkuaiyun.com/mbshqqb/article/details/79799009 HashMap的工作原理是近年来常见的Java面试题。几乎每个Java程序员都知道HashMap,都知道哪里要用HashMap,知道HashTable和HashMap之间的区别,那么为何这道面试题如此特殊呢?是因为这道题考察的深度很深。这题经常出现在高级或中高级面试中。投资银...

Shawn的博客 202

探究hashmap底层原理

HashMap实现采用Entry数组来存储key-value对(数组默认大小为0),每一个键值对组成了一个Entry实体,Entry类实际上是一个单向的链表结构,它具有Next指针,可以连接下一个Entry实体,依次来解决Hash冲突的问题,因为HashMap是按照Key的hash值来计算Entry在HashMap中存储的位置的,如果hash值相同,而key内容不相等,那么就用链表来解决这种hash冲突。如果e不为null,说明map中已经存在所要添加到key,如果value不同,返回旧value,

Stringzhua的博客 907

HashMap的底层原理

在Java编程中,我们经常需要在一个数据集合中查找特定的元素。如果数据集合很小,这个过程可能很简单,我们可以使用传统的查找方法,例如线性查找或二分查找。但是,如果数据集合很大,这些传统的查找方法可能变得非常耗时,效率很低。那么有没有一种更快速、更高效的方法来查找元素呢?答案是肯定的,这就是HashMap这个数据结构。在本文中,我们将深入探讨HashMap的底层原理,了解它是如何工作的,以及为什么它是如此强大和高效的。

qq_51264307的博客 2128

详解 HashMap扩容机制,HashMap的底层原理以及HashSet在底层原理

利用HashCode方法和equals方法HashCode方法来计算出哈希值,根据哈希值计算机出要元素要存入的位置,然后再调用equals方法比较对象内部的属性值是否一样利用什么机制保证去重?**利用HashCode方法和equals方法HashCode方法来计算出哈希值,根据哈希值计算机出要元素要存入的位置,然后再调用equals方法比较对象内部的属性值是否一样。

Java技术加油站的博客 2112

HashMap原理总结

最近面试中被问及Java中HashMap的原理,瞬间无言以对,因此痛定思痛觉得研究一番。 一、Java中的hashCode和equals 1、关于hashCode hashCode的存在主要是用于查找的快捷性,如Hashtable,HashMap等,hashCode是用来在散列存储结构中确定对象的存储地址的 如果两个对象相同,就是适用于equals(java.lang.Object) 方法...

oeSeven的专栏 307

HashMap的原理

转载https://www.cnblogs.com/Lovebugs/p/8706170.html 之前收集的一篇非常好的HashMap的原理的文章 一、HashMap的原理 众所周知,HashMap是用来存储Key-Value键值对的一种集合,这个键值对也叫做Entry,而每个Entry都是存储在数组当中,因此这个数组就是HashMap的主干。 HashMap数组中的每一个元素...

dibing0354的博客 207

HashMap实现原理

①HashMap的工作原理 HashMap基于hashing原理,我们通过put()和get()方法储存和获取对象。当我们将键值对传递给put()方法时,它调用键对象的hashCode()方法来计算hashcode,让后找到bucket位置来储存值对象。当获取对象时,通过键对象的equals()方法找到正确的键值对,然后返回值对象。HashMap使用链表来解决碰撞...

qq_41991988的博客 130
上一篇: SpringBoot实现拦截器和过滤器
下一篇: 测试类写法以及几种常用方式
徐光耀
博客等级 码龄12年 19粉丝 9原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值