【Java】HashMap实现原理---数据结构
作为一个程序猿,特别是Java后端的,应该全部人都用过HashMap,也都知道HaspMap是一个用于存储Key-Value键值对的集合。与此同时我们把每一个键值对也叫做 Entry。
而这些Entry在Java中是存放在一个数组当中的,数组的大小默认为16,如果我们在new一个HashMap的时候没有给初始值得话(自动扩展或初始化时,长度是2的幂)
初始化了的HashMap默认数组中全部的Entry为null
在HashMap中,我们最常用的两个方法:put和get方法
一. Put 方法
例子:hashMap.put(“name”, 123) ,插入一个Key为“name”,value为123的元素
1.这时候会利用一个哈希函数来确定Entry的插入位置(index):index = Hash(“name”),index也就是这个hashmap数组中的下标
2.但是这里会有个问题,因为是通过一个hash函数来计算出的index下标,所以会出现其他的key计算出的index和name计算出来的index是一样的,所以每个数组对应的其实是一个链表,每一个 Entry 对象通过 Next 指针指向它的下一个 Entry 节点。当新来的Entry映射到冲突的数组位置时,会插入到对应的链表中
3.需要注意的是这个链表使用的插入方式是“头部插入”的方式,因为HashMap 的发明者认为,后插入的 Entry 被查找的可能性更大,这样可以加快查找的效率
二.Get方法
例子:hashMap.get(“name”) ,获取一个Key为“name”的元素
1.同样的会把输入的 Key 做一次 Hash 映射,得到对应的 index:index = Hash(“name”),在hashmap数组中的下标为index
2.刚才所说到的 ,不同的key可能映射出来相同的index,造成Hash 冲突,所以同一个位置有可能保存了多个Entry,这时候就需要顺着对应链表的头节点,一个一个根据key来匹配查找。
3.当key被链表中的其中一个entry匹配上了,将这个entry返回
在这里我们基本清楚HashMap的实现原理的,在这个过程中,同时我们也能发现,整个HashMap中有两个方法是非常重要的:
Hash()方法:均匀分布原则,在这个方法中需要均匀的将全部的key分布在所分配到的数组当中,一个好的hash算法,可以将HashMap中的entry更合理的分布到数组当中
equip()方法:这个方法在查找的key被hash之后,在链表查询比对中使用到
【Java】HashMap实现原理---数据结构的更多相关文章
- Java HashMap工作原理及实现
		
Java HashMap工作原理及实现 2016/03/20 | 分类: 基础技术 | 0 条评论 | 标签: HASHMAP 分享到:3 原文出处: Yikun 1. 概述 从本文你可以学习到: 什 ...
 - Java HashMap实现原理 源码剖析
		
HashMap是基于哈希表的Map接口实现,提供了所有可选的映射操作,并允许使用null值和null建,不同步且不保证映射顺序.下面记录一下研究HashMap实现原理. HashMap内部存储 在Ha ...
 - [翻译]Java HashMap工作原理
		
大部分Java开发者都在使用Map,特别是HashMap.HashMap是一种简单但强大的方式去存储和获取数据.但有多少开发者知道HashMap内部如何工作呢?几天前,我阅读了java.util.Ha ...
 - 【转】Java HashMap工作原理(好文章)
		
大部分Java开发者都在使用Map,特别是HashMap.HashMap是一种简单但强大的方式去存储和获取数据.但有多少开发者知道HashMap内部如何工作呢?几天前,我阅读了java.util.Ha ...
 - Java HashMap工作原理深入探讨
		
大部分Java开发者都在使用Map,特别是HashMap.HashMap是一种简单但强大的方式去存储和获取数据.但有多少开发者知道HashMap内部如何工作呢?几天前,我阅读了java.util.Ha ...
 - Java HashMap实现原理分析
		
参考链接:https://www.cnblogs.com/xiarongjin/p/8310011.html 1. HashMap的数据结构 数据结构中有数组和链表来实现对数据的存储,但这两者基本上是 ...
 - java HashMap的原理
		
HashMap的数据结构: 在java编程语言中,最基本的结构就是两种,一个是数组,另外一个是模拟指针(引用),所有的数据结构都可以用这两个基本结构来构造的,HashMap也不例外.HashMap实际 ...
 - Java HashMap工作原理及实现[转]
		
原文:http://yikun.github.io/2015/04/01/Java-HashMap%E5%B7%A5%E4%BD%9C%E5%8E%9F%E7%90%86%E5%8F%8A%E5%AE ...
 - Java HashMap工作原理及实现?
		
参考:http://yikun.github.io/2015/04/01/Java-HashMap%E5%B7%A5%E4%BD%9C%E5%8E%9F%E7%90%86%E5%8F%8A%E5%AE ...
 
随机推荐
- 工作中oracle常用操作
			
常用数据库操作 启动数据库监听器lsnrctl start 停止数据库监听器lsnrctl stop 登录oraclesqlplus / as sysdba启动oralcestartup;关闭orac ...
 - doxygen上手
			
doxygen {#mainpage} doxygen是干什么的 相信大家在看MCU原厂的帮助文档的时候,都能看到doxygen的logo在右下角,没错,doxygen就是用来生成帮助文档的 doxy ...
 - nginx学习资料整理一
			
一.安装运行 1.1.安装环境支撑 1.gcc 环境,一般情况linux 系统自带该环境,也可自行下载安装使用新版本: 2.pcre 环境,一般需自行安装,其是一个perl库,包含正则表达式等功能,h ...
 - 北京理工大学复试上机--2001B
			
1.请输入高度 h,输入一个高为 h,上底边长为 h的等腰梯形(例如 h=4,图形如下). **** ****** ******** ********** #include <ios ...
 - Rocket - devices - DevNullDevice
			
https://mp.weixin.qq.com/s/rAmXl-0gDAJqWmy1R3KrlA 简单介绍DevNullDevice的实现. 1. DevNullParams DevNullPara ...
 - html css javascript实现弹弹球
			
效果如图: 原创代码: <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> & ...
 - UML ——六种依赖关系.md
			
在UML类图中,常见的有以下几种关系: 泛化(Generalization), 实现(Realization), 关联(Association), 聚合(Aggregation), 组合(Compos ...
 - 关于vue 中elementui 的表格边框隐藏
			
最近写到一个项目需要实现边框隐藏,网上查找了好多笔记,回答都好含糊不清.为此,记录一下自己的实现方法: 需求: 要将如下表格边框去除 效果图: ...
 - Java实现 LeetCode 719 找出第 k 小的距离对(二分搜索法+二分猜数字)
			
719. 找出第 k 小的距离对 给定一个整数数组,返回所有数对之间的第 k 个最小距离.一对 (A, B) 的距离被定义为 A 和 B 之间的绝对差值. 示例 1: 输入: nums = [1,3, ...
 - Java中BigDecimal类的常用方法
			
1.简介 BigDecimal类位于java.math.BigDecimal包下.使用此类可以完成大的小数操作,而且也可以使用此类进行精确的四舍五入,这一点在开发中经常使用. 对于不需要任何准确计算精 ...