HashMap的底层原理

一:HashMap的节点:HashMap是一个集合,键值对的集合,源码中每个节点用Node<K,V>表示

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

Node是一个内部类,这里的key为键,value为值,next指向下一个元素,可以看出HashMap中的元素不是一个单纯的键值对,还包含下一个元素的引用

二:HashMap的数据结构:HashMap的数据结构为 数组+(链表或红黑树),上图:

img

为什么采用这种结构来存储元素呢?

数组的特点:查询效率高,插入,删除效率低

链表的特点:查询效率低,插入删除效率高

在HashMap底层使用数组加(链表或红黑树)的结构完美的解决了数组和链表的问题,使得查询和插入,删除的效率都很高。

三:HashMap存储元素的过程:

有这样一段代码:

HashMap<String,String> map = new HashMap<String,String>();
map.put("刘德华","张惠妹");
map.put("张学友","大S");

现在我要把键值对 “刘德华”,”张惠妹”存入map:

第一步:计算出键“刘德华”的hashcode,该值用来定位要将这个元素存放到数组中的什么位置.

什么是hashcode?

在Object类中有一个方法:

public native int hashCode();

该方法用native修饰,所以是一个本地方法,所谓本地方法就是非java代码,这个代码通常用c或c++写成,在java中可以去调用它。

调用这个方法会生成一个int型的整数,我们叫它哈希码,哈希码和调用它的对象地址和内容有关.

哈希码的特点是:

对于同一个对象如果没有被修改(使用equals比较返回true)那么无论何时它的hashcode值都是相同的

对于两个对象如果他们的equals返回false,那么他们的hashcode值也有可能相等

明白了hashcode我们再来看元素如何通过hashcode定位到要存储在数组的哪里,通过hashcode值和数组长度取模我们可以得到元素存储的下标。

刘德华的hashcode为20977295 数组长度为 16则要存储在数组索引为 20977295%16=1的地方

img

可以分两种情况:

  1. 数组索引为1的地方是空的,这种情况很简单,直接将元素放进去就好了。

  2. 已经有元素占据了索引为1的位置,这种情况下我们需要判断一下该位置的元素和当前元素是否相等,使用equals来比较。

如果使用默认的规则是比较两个对象的地址。也就是两者需要是同一个对象才相等,当然我们也可以重写equals方法来实现我们自己的比较规则最常见的是通过比较属性值来判断是否相等。

如果两者相等则直接覆盖如果不等则在原元素下面使用链表的结构存储该元素

img

每个元素节点都有一个next属性指向下一个节点,这里由数组结构变成了数组+链表结构,红黑树又是怎么回事呢?

因为链表中元素太多的时候会影响查找效率,所以当链表的元素个数达到8的时候使用链表存储就转变成了使用红黑树存储,原因就是红黑树是平衡二叉树,在查找性能方面比链表要高.

**四:HashMap中的两个重要的参数:**HashMap中有两个重要的参数:初始容量大小和加载因子,初始容量大小是创建时给数组分配的容量大小,默认值为16,用数组容量大小乘以加载因子得到一个值,一旦数组中存储的元素个数超过该值就会调用rehash方法将数组容量增加到原来的两倍,专业术语叫做扩容.

在做扩容的时候会生成一个新的数组,原来的所有数据需要重新计算哈希码值重新分配到新的数组,所以扩容的操作非常消耗性能.

img

创建HashMap时我们可以通过合理的设置初始容量大小来达到尽量少的扩容的目的。加载因子也可以设置,但是除非特殊情况不建议设置.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/557103.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

linux 远程调试文件夹,GDB远程调试开发板程序

一、概述可能我们都熟悉直接在发行版linux系统下调试系统&#xff0c;只需要在安装系统的时候包含了调试工具&#xff0c;直接可以根据gdb进行调试。但对于很多做嵌入式的来说&#xff0c;可能经常需要调试运行在开发板上的应用程序&#xff0c;下面就来说说。先说一下我们的调…

linux必备工具,Linux装机必备工具

分类 名称 类比 说明压缩工具 RAR for Linux WinRAR Linux中压缩解压RAR格式文件的工具联络聊天 EVA QQ 一个界面、使用 类似QQ的聊天工具。MP3 播放 XMMS WinAmp Linux中MP3播放器下载工具 Downloader4X FlashGet Linux中的多线程下载利器流媒体播放 RealPlayer 10 RealPlaye…

hashMap 底层原理+LinkedHashMap 底层原理+常见面试题

1.源码 java1.7 hashMap 底层实现是数组链表 java1.8 对上面进行优化 数组链表红黑树 2.hashmap 是怎么保存数据的。 在hashmap 中有这样一个结构 Node implenets Map.entity{hashkeyvaluenext} 当我们向hashMap 中放入数据时&#xff0c;其实就是一个 Enity{keyvaue}在存之…

linux时间跳变影响,MONGO 集群 修改linux主机时间后的影响

生产环境是一主一从一仲裁3分片的集群&#xff0c;现在发现其中一个节点比当前时间大了好几天&#xff0c;后使用NTP将时间往回调整副本集上。原来时间是5月3日&#xff0c;当前是4月26日&#xff0c;对此进行了调整。[rootcwdtest1 bin]# dateFri May 3 13:20:31 CST 2019[ro…

Java容器解析——HashMap

前言 HashMap是一个散列表&#xff0c;它存储的内容是键值对(key-value)映射。 1 定义 public class HashMap<K,V> extends AbstractMap<K,V>implements Map<K,V>, Cloneable, Serializable {}由HashMap定义可以看出 1&#xff09; HashMap<K,V>表示…

linux教程第五版第三章课后答案,linux 第三章 章习题.doc

填空题Linux_____可以理解为运行在_____之上&#xff0c;回避直接操作_____和配置文件的应用程序。在Linux中常见的两种图形环境是_____和______。在Linux中的配置文件为____和_____。在Fedor8.0中可以通过____窗口进行主题设置。在“自定义主题”对话框中可以对“控件”、“颜…

xp下添加linux启动项,grub.cfg--XP+ Ubuntu10.04双系统安装后无XP启动项

问题描述&#xff1a;Ubuntu 10.04发布了&#xff0c;随即裸机安装了Windows XP &#xff0c;然后用U盘启动盘安装了Ubuntu 10.04,安装速度飞快(不到10分钟吧)&#xff0c;但是装上后发现在grub启动项里没有XP&#xff0c;郁闷了&#xff0c;花了几分钟终于解决了&#xff0c;呵…

HashMap 源码详细分析(JDK1.8)

1. 概述 本篇文章我们来聊聊大家日常开发中常用的一个集合类 - HashMap。HashMap 最早出现在 JDK 1.2中&#xff0c;底层基于散列算法实现。HashMap 允许 null 键和 null 值&#xff0c;在计算哈键的哈希值时&#xff0c;null 键哈希值为 0。HashMap 并不保证键值对的顺序&…

linux错误码61,Linux编程中的错误码列表

有时可以知道错误的数值&#xff0c;但是如果不知道对应于那个宏定义&#xff0c;也很难知道这个错误描述的是什么。我平时这两种方法来确定&#xff1a;在内核源码中搜索和查看头文件。 在内核源码中搜索一般都可以搜到&#xff0c;而且使用source insight的话也很方便&#x…

linux无限刷屏代码,linux下如何实现简单刷屏

今天为了测试我的LCD有没有坏点写了一个简单的刷屏程序&#xff0c;效果还不错&#xff0c;分析给大家。代码如下&#xff1a;#include #include #include #include #include #include #include #include int main(int argc,char *argv[]){int fbfd 0;struct fb_var_screeninf…

mvc:annotation-driven 注解的作用

1.自动注册映射处理器和适配器 这是该注解的主要功能&#xff0c;添加< mvc:annotation-driven/>注解后&#xff0c;容器中会<自动注册HandlerMapping与HandlerAdapter 两个bean。省去手动注册HandlerMapping和HandlerAdapter的步骤。 当配置了< mvc:annotation-…

linux主机熵值过小,tomcat在linux启动应用慢解决方式

问题&#xff1a;o.a.c.util.SessionIdGeneratorBase - Creation of SecureRandom instance for session ID generation using [SHA1PRNG] took [2,741] milliseconds原因&#xff1a;拿Tomcat /dev/random做关键词&#xff0c;一堆详细说明。建议看wiki。https://www.cnblogs.…

@Autowired注解能用在static属性吗?autowired注入static属性上为null

Autowired注解能用在static属性吗&#xff1f; 答案是否定的&#xff0c;我们来测试下&#xff1a; 日志信息已经很明确了&#xff0c;表示static不能被Autowired进行复制。为什么呢&#xff1f;我们现在就来一起了解其原因。 首先将我们的测试环境搭建好&#xff0c; Use…

linux下用c语言写黄金矿工,C语言写的黄金矿工O(∩_∩)O---初稿,能玩了

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼int main(void){initgr();go();getch();closegr();return 0;}void youxiye() /* 游戏页 */{setfillstyle(SOLID_FILL,15);bar(0,0,639,49);setfillstyle(SOLID_FILL,6);bar(0,49,639,349);setcolor(BLUE);line(0,49,638,49);setc…

Swagger介绍及使用

导语&#xff1a; 相信无论是前端还是后端开发&#xff0c;都或多或少地被接口文档折磨过。前端经常抱怨后端给的接口文档与实际情况不一致。后端又觉得编写及维护接口文档会耗费不少精力&#xff0c;经常来不及更新。其实无论是前端调用后端&#xff0c;还是后端调用后端&…

linux 安装libcurl4-gnutls-dev,curl / curl.h,libcurl,libcurl4-openssl-dev,libcurl4-nss-dev库之间的区别?...

我有以下curl标题,我仍然可以安装上面提到的libcurl4包 –kafkaMetamorphosis:~$ll /usr/include/curl/total 200drwxr-xr-x 2 root root 4096 Jan 16 13:29 ./drwxr-xr-x 51 root root 20480 Jan 16 13:29 ../-rw-r--r-- 1 root root 7303 Dec 18 01:11 curlbuild.h-rw-r--r--…

c语言输入四个成绩求最高分最低分,数组实现学生成绩录入、求最高分、最低分、平均分和排序...

/*使用数组实现10名学生的成绩录入&#xff0c;并输出这10名学生中成绩的最高分最低分平均分按照分数从大到小排序思考&#xff1a;如何实现从小到大排序&#xff1f;如果学院有5个班&#xff0c;每个班30人&#xff0c;如何处理&#xff1f;求所有成绩中的最高分是哪个班的&am…

c语言课设宿舍管理程序,C语言程序课程设计宿舍管理软件.doc

C语言程序课程设计宿舍管理软件.doc课程设计(论文)题 目 名 称 宿舍管理软件课 程 名 称 C语言程序课程设计学 生 姓 名学 号系 、专 业 信息工程系、信息大类指 导 教 师 黄 同 成目 录1 前言2 需求分析62.1要求62.2任务2.3运行环境2.4开发工具3 概要设计与详细设计73.1设计原…

接口文档生成工具Swagger2的使用

一、什么是Swagger Swagger 是一个规范和完整的框架&#xff0c;用于生成、描述、调用和可视化 RESTful 风格的 Web 服务。总体目标是使客户端和文件系统作为服务器以同样的速度来更新。文件的方法&#xff0c;参数和模型紧密集成到服务器端的代码&#xff0c;允许API来始终保…

Netty详解

一&#xff0e;Netty介绍 1.什么是netty Netty 是由 JBOSS 提供的一个 Java 开源框架。Netty 提供异步的、基于事件驱动的网络应用程序框架&#xff0c;用以快速开发高性能、高可靠性的网络 IO 程序,是目前最流行的 NIO 框架&#xff0c;Netty 在互联网领域、大数据分布式计算…