首页 > 其他分享 >Map详解

Map详解

时间:2023-07-01 21:01:34浏览次数:25  
标签:Map HashMap 数组 索引 详解 键值 哈希

背景介绍

我们在日常的开发的过程中,一直都有在使用Map存储数据。但是Map的底层原理,以及Map的Key值为什么不能重复,Map中的key值和Hash有什么关系大家都清楚吗,如果我们把这些内容都搞清楚了我们在使用Map的时候才会得心应手,排查关于Map相关的问题才会更加的容易,才会更快的去定位问题出现的原因,下面我们就深入了解一下Map。

详细说明

什么是Map

Map是Java中的一个接口,用于存储键值对(key-value)数据。它提供了一种将键映射到值的方式,可以根据键快速地获取对应的值。

使用Map有什么好处

  1. 易于使用和理解:Map提供了简单明了的接口和方法,使得我们可以方便地进行键值对数据的操作,如添加、删除、修改和查询。
  2. 高效的查找操作:Map使用哈希表或平衡二叉树等数据结构来实现键值对的存储,可以通过键快速地定位到对应的值,从而提供高效的查找操作。
  3. 灵活的键和值:Map的键和值可以是任意类型的对象,不像数组只能使用整数索引。这使得我们可以根据具体的需求自由选择键和值的类型。
  4. 不允许重复的键:Map中的键是唯一的,不允许重复。这样可以保证每个键都对应唯一的值,避免了数据的冗余和混乱。

Map底层原理

HashMap底层使用了数组和链表/红黑树的数据结构。当我们向HashMap中添加键值对时,HashMap会根据Key的哈希码来确定Key在数组中的索引位置。下面是一个简化的示例,说明HashMap的底层原理:

1.创建一个HashMap对象:

Map<String, Integer> map = new HashMap<>();

2.向HashMap中添加键值对:

map.put("wzl", 10);
map.put("武梓龙", 5);
map.put("W", 8);

3.获取Key的哈希码:

int hash1 = "wzl".hashCode();   // 哈希码为123456
int hash2 = "武梓龙".hashCode();  // 哈希码为789012
int hash3 = "Wzil".hashCode();  // 哈希码为345678

4.根据哈希码计算数组索引位置:

int index1 = hash1 % arrayLength;  // 假设数组长度为16,索引位置为2
int index2 = hash2 % arrayLength;  // 索引位置为4
int index3 = hash3 % arrayLength;  // 索引位置为10

5.在数组中存储键值对:

Entry<String, Integer> entry1 = new Entry<>("wzl", 10);   // Entry是HashMap中的内部类,用于存储键值对
Entry<String, Integer> entry2 = new Entry<>("武梓龙", 5);
Entry<String, Integer> entry3 = new Entry<>("Wzil", 8);

// 数组中的索引位置2上存储entry1
// 数组中的索引位置4上存储entry2
// 数组中的索引位置10上存储entry3

6.处理哈希冲突: 当两个不同的Key生成相同的哈希码时,称之为哈希冲突。HashMap使用链表或红黑树来解决哈希冲突。 假设"apple"和"banana"生成了相同的哈希码,它们都计算出了索引位置2:

// 数组中的索引位置2上原本存储了entry1,现在需要将entry2插入到链表中
entry1 -> entry2

这就是HashMap的简单示例,说明了HashMap底层使用数组和链表/红黑树的数据结构来存储键值对。通过哈希码和数组索引的计算,可以快速定位到存储键值对的位置。当发生哈希冲突时,使用链表或红黑树来解决。这样,HashMap可以提供快速的插入、删除和查找操作。

总结提升

Map是Java中常用的数据结构之一,用于存储键值对数据。Key值和Hash之间有关联,通过哈希函数将Key映射到数组的索引位置。Map提供了丰富的操作方法,可以方便地进行数据的增删改查操作。在选择Map实现类时,需要根据具体的需求和性能要求进行选择。

标签:Map,HashMap,数组,索引,详解,键值,哈希
From: https://blog.51cto.com/u_16102679/6601451

相关文章

  • paging_init 详解
    建立二级页表项由set_pte_ext宏实现,实际上底层调用的是在内核启动之初获取的list->processor->set_pte_ext,这是处理器相关的处理函数,对应的函数实现为cpu_v7_set_pte_ext,在arch/arm/mm/proc-v7-2level.S中。ENTRY(cpu_v7_set_pte_ext)#ifdefCONFIG_MMUstrr1,[......
  • nginx之location规则详解
    一、语法规则:=开头表示精确匹配^~ 开头表示uri以某个常规字符串开头,理解为匹配url路径即可(非正则)~ 开头表示区分大小写的正则匹配~* 开头表示不区分大小写的正则匹配!~和!~*分别为区分大小写不匹配及不区分大小写不匹配的正则/ 通用匹配,任何请求都会匹配......
  • nginx之proxy_pass规则详解
    在nginx中配置proxy_pass代理转发时,如果在proxy_pass后面的url加/,表示绝对根路径;如果没有/,表示相对路径,把匹配的路径部分也给代理走。假设下面四种情况分别用http://192.168.1.1/proxy/test.html进行访问。第一种:location/proxy/{proxy_passhttp://127.0.0.1/;}代......
  • gcc/g++ 编译选项详解
    编译步骤gcc与g++区别gcc命令的常用选项编译优化选项-O优化-O1优化-O2-O0-Os-Ofast-Og-Oz-O选项控制特定的优化WarningsReference编译步骤gcc、g++分别是gnu的c&c++编译器。实际上,GCC能够编译三种语言:C、C++和Ob......
  • 【胖虎的逆向之路】——GOT/PLT Hook详解&针对自定义so库的Hook实操
    文章目录@[TOC](文章目录)前言一、ELF是什么?1、ELF的概念2、ELF的组成2.1、两种视图是什么呢?2.2、ELF文件头又是什么西西?2.2、ELF中节头表是什么南南呢?2.2、ELF中程序头表是什么北北呢?二、动态库装载、动态链接与重定位简单理解1、装载2、动态链接3、重定位三、PLT与GOTHoo......
  • HashMap底层实现原理解析
    我们常见的有数据结构有三种结构: 数组结构 链表结构 哈希表结构下面我们来看看各自的数据结构的特点:1)数组结构:存储区间连续、内存占用严重、空间复杂度大优点:随机读取和修改效率高,原因是数组是连续的(随机访问性强,查找速度快)缺点:插入和删除数据效率低,因插入数据,这个位置后......
  • find命令mtime,ctime,atime详解
    1.查找时间说明find./-name“*data*”-mtime+1当前目录下文件名包含data,而且修改时间在48小时以上的find./-name“*date*”-mtime+2当前目录下文件名包含data,而且修改时间在72小时以上的find./name“*data*”-mtime-1当前目录下文件名包含data,而且修改时间在24......
  • 大数据面试题集锦-Hadoop面试题(三)-MapReduce
    你准备好面试了吗?这里有一些面试中可能会问到的问题以及相对应的答案。如果你需要更多的面试经验和面试题,关注一下"张飞的猪大数据分享"吧,公众号会不定时的分享相关的知识和资料。目录1、谈谈Hadoop序列化和反序列化及自定义bean对象实现序列化?2、FileInputFormat切片机制3、......
  • Docker网络管理_Docker0网络详解
    Docker网络管理_Docker0网络详解清空所有容器来测试dockerstop$(dockerps-aq)dockerrm$(dockerps-aq)思考注意:每启动一个docker容器,docker就会给容器分配一个ip,只要安装docker就会有一个docker0网卡。evth-pair技术evth-pair就是一对的虚拟设备接口,它们都......
  • python import详解
    参考:https://zhuanlan.zhihu.com/p/156774410import绝对是我们在使用python时最常用的语句之一了,但其实关于import,需要注意的地方还真不少,如导入第三方库,导入自己写的库,导入相对路径下文件中的方法,在包内部的相对与绝对导入等导入源;有导入的顺序;有LazyLoad惰性导入方法;有已经导......