`
拓子轩
  • 浏览: 211821 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

HashMap的实现原理及源码分析

    博客分类:
  • java
阅读更多

一、HashMap概述

    HashMap通过键值的方式存储数据,为非线程安全的类,键和值可以为null,键不能重复,继承了AbstractMap并实现了Map接口

 

二、源码分析(基于JDK1.7)

 

1. HashMap中的主要成员变量

 

DEFAULT_INITIAL_CAPACITY:静态整型常量,默认初始化的容量,其值为16(必须是2的指数倍)

MAXIMUM_CAPACITY:静态整型常量,表示最大容量为2的30次方。如果通过构造器传入的容量大于最大容量,会被此最大容量值替换

DEFAULT_LOAD_FACTOR:静态浮点型常量,表示默认的加载因子,其值为0.75f;如果在构造器中没有指定加载因子,则使用此默认值

table:存储数据的Entry数组(Entry<K,V>[]),会做必要的调整,长度是2的指数倍

size:HashMap的大小,是保存在HashMap里key-value键值对的数量

threshold:HashMap的阈值,用于判断是否要调整HashMap的容量,其值等于容量*加载因子

loadFactor:加载因子实际大小,常量

modCount:HashMap被改变的次数

 

2. HashMap中的读取(get方法)

2.1 如果传入的键(key)为null,则从Entry数组table中索引下标为0的链表中查找key为null的值并返回,未找到则返回null

2.2 如果传入的键(key)不为null,则获取key对应的哈希值hash

2.3 通过哈希值hash获取对应在table数组中的索引下标(h & (length-1))

2.4 循环遍历table数组中该索引下标对应的Entry链表

2.5 如果传入的键(key)的哈希值(hash)等于该Entry的哈希值(hash),

     并且传入的键(key)等于(==)或等同于(equals)该Entry的key,

     则此Entry便是要查找的Entry对象,遍历完该Entry链表如果还未查找到,则返回null

2.6 返回查找到的Entry对象的值(value),未查找到则返回null

 

3. HashMap中存入键值(put方法)

3.1 如果key为null,则从Entry数组table中索引下标为0的链表中,

     查找是否已经存在了key为null的Entry,如果存在则替换这个Entry的值为新的值,并返回旧值;

     如果不存在key为null的Entry,则先把修改数(modCount)自增1,然后添加一个新的Entry,

     key为null,value为传入的值,并把该Entry放入table[0]位置上链表的头部,并返回null。

3.2 如果key不为null,先获取key的哈希值hash,并通过hash确定Entry数组table的索引下标i

     对table[i]位置的链表进行循环遍历,查找是否已经存在key值相同的Entry(传入key的哈希值

     与该Entry的哈希值相等,并且传入key等于或等同于Entry的key),如果存在则把它的值替换

     成新值,并返回旧值;

     如果不存在,则先把修改数(modCount)自增1,然后在table[i]对应的链表的头部添加一个Entry

     并返回null。

 

三、要点分析

 

1. 链表的原理和实现

    HashMap中的链表由Entry类组成,Entry包含三个元素:key,value和next(指向下一个Entry的)

    在HashMap中的链表加入新的Entry,会放在链表头部位置,新的Entry的next元素指向原来在链表头部的Entry

 

2. modCount的作用

    modCount为修改次数,在进行put、remove、clear等操作时会修改数modCount加1

    HashMap中不是线程安全的,如果在使用迭代器的过程中有其他线程修改了HashMap,那么将抛出ConcurrentModificationException,即Fail-Fast策略

    在迭代过程中,是通过modCount跟expectedModCount是否相等来判定其他线程有没有修改的,如果不相等,说明其他线程修改了

 

四、总结

 

1. HashMap是基于哈希表的Map接口的非同步实现,允许key和vaue为null

2. HashMap内部是有数组和链表实现的,通过key的哈希值找到在数组中位置,

    并遍历该位置的链表,找到key值相同的Entry。

3. 当我们往hashmap中put元素的时候,先根据key的hash值得到这个元素在数组中的位置(即下标),

    然后就可以把这个元素放到对应的位置中了。如果这个元素所在的位子上已经存放有其他元素了,

    那么在同一个位子上的元素将以链表的形式存放,新加入的放在链头,最先加入的放在链尾。

    从hashmap中get元素时,首先计算key的hashcode,找到数组中对应位置的某一元素,

    然后通过key的equals方法在对应位置的链表中找到需要的元素。从这里我们可以想象得到,

    如果每个位置上的链表只有一个元素,那么hashmap的get效率将是最高的

 

0
1
分享到:
评论

相关推荐

    【java毕业设计】智慧社区教育服务门户.zip

    有java环境就可以运行起来 ,zip里包含源码+论文+PPT, 系统设计与功能: 文档详细描述了系统的后台管理功能,包括系统管理模块、新闻资讯管理模块、公告管理模块、社区影院管理模块、会员上传下载管理模块以及留言管理模块。 系统管理模块:允许管理员重新设置密码,记录登录日志,确保系统安全。 新闻资讯管理模块:实现新闻资讯的添加、删除、修改,确保主页新闻部分始终显示最新的文章。 公告管理模块:类似于新闻资讯管理,但专注于主页公告的后台管理。 社区影院管理模块:管理所有视频的添加、删除、修改,包括影片名、导演、主演、片长等信息。 会员上传下载管理模块:审核与删除会员上传的文件。 留言管理模块:回复与删除所有留言,确保系统内的留言得到及时处理。 环境说明: 开发语言:Java 框架:ssm,mybatis JDK版本:JDK1.8 数据库:mysql 5.7及以上 数据库工具:Navicat11及以上 开发软件:eclipse/idea Maven包:Maven3.3及以上

    基于selenium的携程机票爬虫资料齐全+详细文档+高分项目+源码.zip

    【资源说明】 基于selenium的携程机票爬虫资料齐全+详细文档+高分项目+源码.zip 【备注】 1、该项目是个人高分项目源码,已获导师指导认可通过,答辩评审分达到95分 2、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 3、本项目适合计算机相关专业(人工智能、通信工程、自动化、电子信息、物联网等)的在校学生、老师或者企业员工下载使用,也可作为毕业设计、课程设计、作业、项目初期立项演示等,当然也适合小白学习进阶。 4、如果基础还行,可以在此代码基础上进行修改,以实现其他功能,也可直接用于毕设、课设、作业等。 欢迎下载,沟通交流,互相学习,共同进步!

    【java毕业设计】智慧社区宠物管理系统(源代码+论文+PPT模板).zip

    zip里包含源码+论文+PPT,有java环境就可以运行起来 ,功能说明: 文档开篇阐述了随着计算机技术、通信技术和网络技术的快速发展,智慧社区门户网站的建设成为了可能,并被视为21世纪信息产业的主要发展方向之一 强调了网络信息管理技术、数字化处理技术和数字式信息资源建设在国际竞争中的重要性。 指出了智慧社区门户网站系统的编程语言为Java,数据库为MYSQL,并实现了新闻资讯、社区共享、在线影院等功能。 系统设计与功能: 文档详细描述了系统的后台管理功能,包括系统管理模块、新闻资讯管理模块、公告管理模块、社区影院管理模块、会员上传下载管理模块以及留言管理模块。 系统管理模块:允许管理员重新设置密码,记录登录日志,确保系统安全。 新闻资讯管理模块:实现新闻资讯的添加、删除、修改,确保主页新闻部分始终显示最新的文章。 公告管理模块:类似于新闻资讯管理,但专注于主页公告的后台管理。 社区影院管理模块:管理所有视频的添加、删除、修改,包括影片名、导演、主演、片长等信息。 会员上传下载管理模块:审核与删除会员上传的文件。 留言管理模块:回复与删除所有留言,确保系统内的留言得到及时处理。

    免费下载:Civil War (Stuart Moore)_xVBgd.zip

    免费下载:Civil War (Stuart Moore)_xVBgd.zip

    JSP基于WEB的图书馆借阅系统的设计与实现(源代码+论文)(2024pw).7z

    1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于计算机科学与技术等相关专业,更为适合;

    免费下载:Spider-Man (Stefan Petrucha)_2pBuA.zip

    免费下载:Spider-Man (Stefan Petrucha)_2pBuA.zip

    jj视频合并程序代码QZQ.txt

    jj视频合并程序代码QZQ

    【java毕业设计】智慧社区会员等级提升系统(源代码+论文+PPT模板).zip

    zip里包含源码+论文+PPT,有java环境就可以运行起来 ,功能说明: 文档开篇阐述了随着计算机技术、通信技术和网络技术的快速发展,智慧社区门户网站的建设成为了可能,并被视为21世纪信息产业的主要发展方向之一 强调了网络信息管理技术、数字化处理技术和数字式信息资源建设在国际竞争中的重要性。 指出了智慧社区门户网站系统的编程语言为Java,数据库为MYSQL,并实现了新闻资讯、社区共享、在线影院等功能。 系统设计与功能: 文档详细描述了系统的后台管理功能,包括系统管理模块、新闻资讯管理模块、公告管理模块、社区影院管理模块、会员上传下载管理模块以及留言管理模块。 系统管理模块:允许管理员重新设置密码,记录登录日志,确保系统安全。 新闻资讯管理模块:实现新闻资讯的添加、删除、修改,确保主页新闻部分始终显示最新的文章。 公告管理模块:类似于新闻资讯管理,但专注于主页公告的后台管理。 社区影院管理模块:管理所有视频的添加、删除、修改,包括影片名、导演、主演、片长等信息。 会员上传下载管理模块:审核与删除会员上传的文件。 留言管理模块:回复与删除所有留言,确保系统内的留言得到及时处理。

    jsp医院病区管理系统(论文+中期检查表+任务书+综合材料)(20242g).7z

    1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于计算机科学与技术等相关专业,更为适合;

    基于卷积神经网络的通信调制方式识别详细文档+全部资料+优秀项目+源码.zip

    【资源说明】 基于卷积神经网络的通信调制方式识别详细文档+全部资料+优秀项目+源码.zip 【备注】 1、该项目是个人高分项目源码,已获导师指导认可通过,答辩评审分达到95分 2、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 3、本项目适合计算机相关专业(人工智能、通信工程、自动化、电子信息、物联网等)的在校学生、老师或者企业员工下载使用,也可作为毕业设计、课程设计、作业、项目初期立项演示等,当然也适合小白学习进阶。 4、如果基础还行,可以在此代码基础上进行修改,以实现其他功能,也可直接用于毕设、课设、作业等。 欢迎下载,沟通交流,互相学习,共同进步!

    计算机网络学习之旅.pptx

    理层、数据链路层、网络层、传输层和应用层的功能、技术和协议。同时,对网络安全、无线网络、网络管理和网络新技术进行了深入剖析。通过案例分析帮助学习者更好地理解实际应用,推荐学习资源助力深入学习。最后总结要点并展望未来网络发展趋势,为计算机网络学习者提供了丰富的知识和实用的指导。

    51单片机控制的智能小车.7z

    51单片机控制的智能小车.7z

    计算结构体变量的内存大小1.cpp

    计算结构体变量的内存大小1.cpp

    基于多智能体深度强化学习的车联网通信资源分配优化详细文档+全部资料+源码.zip

    【资源说明】 基于多智能体深度强化学习的车联网通信资源分配优化详细文档+全部资料+源码.zip 【备注】 1、该项目是个人高分项目源码,已获导师指导认可通过,答辩评审分达到95分 2、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 3、本项目适合计算机相关专业(人工智能、通信工程、自动化、电子信息、物联网等)的在校学生、老师或者企业员工下载使用,也可作为毕业设计、课程设计、作业、项目初期立项演示等,当然也适合小白学习进阶。 4、如果基础还行,可以在此代码基础上进行修改,以实现其他功能,也可直接用于毕设、课设、作业等。 欢迎下载,沟通交流,互相学习,共同进步!

    空中俯视物体检测11-YOLO(v5至v9)、COCO、CreateML、Paligemma数据集合集.rar

    空中俯视物体检测11-YOLO(v5至v9)、COCO、CreateML、Paligemma数据集合集.rarDOTA V2开发训练-V1 2023-12-28 10:02 PM ============================= *与您的团队在计算机视觉项目上合作 *收集和组织图像 *了解和搜索非结构化图像数据 *注释,创建数据集 *导出,训练和部署计算机视觉模型 *使用主动学习随着时间的推移改善数据集 对于最先进的计算机视觉培训笔记本,您可以与此数据集一起使用 该数据集包括8388张图像。 以可可格式注释了飞机船舶存储 - 基准桶。 将以下预处理应用于每个图像: 没有应用图像增强技术。

    jsp网上购书系统设计(源代码+论文)(202490).7z

    1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于计算机科学与技术等相关专业,更为适合;

    基于selenium与requests的暨南大学自动健康打卡程序资料齐全+详细文档+高分项目+源码.zip

    【资源说明】 基于selenium与requests的暨南大学自动健康打卡程序资料齐全+详细文档+高分项目+源码.zip 【备注】 1、该项目是个人高分项目源码,已获导师指导认可通过,答辩评审分达到95分 2、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 3、本项目适合计算机相关专业(人工智能、通信工程、自动化、电子信息、物联网等)的在校学生、老师或者企业员工下载使用,也可作为毕业设计、课程设计、作业、项目初期立项演示等,当然也适合小白学习进阶。 4、如果基础还行,可以在此代码基础上进行修改,以实现其他功能,也可直接用于毕设、课设、作业等。 欢迎下载,沟通交流,互相学习,共同进步!

    免费下载:Hilma af Klint a Biography (Julia Voss)_tFy2T.zip

    免费下载:Hilma af Klint a Biography (Julia Voss)_tFy2T.zip

    jsp学生管理系统-毕业设计(2024d5).7z

    1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于计算机科学与技术等相关专业,更为适合;

    基于python的图书管理系统demo脚本

    图书管理系统作为示例,这个系统将包括以下功能: 功能要求 用户管理:注册、登录、查看用户信息。 图书管理:添加、删除、修改、查询图书信息。 借书和还书:用户可以借阅图书并记录借书信息。 查询功能:按书名、作者、ISBN查询图书。 日志记录:记录系统中的所有操作。 使用技术 Python:作为主要编程语言。 Flask:一个轻量级的Web框架。 SQLite:作为数据库来存储用户和图书信息。 SQLAlchemy:ORM工具,简化数据库操作。 Flask-Login:用于管理用户会话。 Flask-WTF:处理表单。 Bcrypt:密码哈希处理。 数据库设计 Users Table: id, username, password, email Books Table: id, title, author, isbn, quantity Borrow Table: id, user_id, book_id, borrowed_date, return_date 扩展需求 安全控制: 所有用户数据加密存储。 使用HTTPS来加密传输的数据。 实现角色和权限控制,管理员可以管理图书和用户,普

Global site tag (gtag.js) - Google Analytics