文章分为五部分
HashMap的预备知识
HashMap的底层实现原理
HashMap的1.7和1.8
HashMap的put与get
提示:以下是本篇文章正文内容,下面案例可供参考
1.HashMap是Map的常用子类
java.util.HashMap<k,v> 集合 implements Map<k,v>接口
2.HashMap集合特点
HashMap集合底层是哈希表,查询速度特别快
jdk1.7:数组+单向链表
jdk1.8:数组+单向链表/红黑树(链表长度超过8,数组达到64)
3.HashMap集合是一个无序的集合,存储元素和取出元素的顺序有可能不一致
HashMap是Java中的最频繁的一种数据结构
在深入HashMap前先明白两种数据结构,数组和链表
数组
查询速度快,可以根据索引查询;但插入和删除比较困难
链表
查询速度慢,需要遍历整个链表,但插入和删除操作比较容易。
HashMap
底层是一个hash表(数组+链表),这种结构集合了数组和链表的好处 。在jdk1.7中,只是单纯的数组+链表的结构,但是如果散列表中的hash碰撞过多时,会造成效率的降低,所以在JKD1.8中对这种情况进行了控制,当一个hash值上的链表长度大于8时,该节点上的数据就不再以链表进行存储,而是转成了一个红黑树
HashMap 基于 Hash 算法实现的
JDK1.7
JDK1.7采用的是拉链法。拉链法:将链表和数组相结合。也就是说创建一个链表数组,数组中每一格就是一个链表。若遇到哈希冲突,则将冲突的值加到链表中即可。
JDK1.8
相比于之前的版本,jdk1.8在解决哈希冲突时有了较大的变化,当链表长度大于阈值(默认为8)同时数组长度达到64,将链表转化为红黑树,以减少搜索时间。(红黑树节点为6时转回链表)
JDK1.8主要对HashMap进行了一系列优化
put方法
key的hashcode经过高低位异或后的值,然后(table.length - 1) & hash得到槽位下标
get方法
拿到key算出对应索引
5. 根据得到的索引,映射到对应的哈希桶,判断该元素是不是头结点,如果是则直接拿到
6. 如果不是头一个节点,用do while循环遍历链表,链表都是next指向一次拿元素
7. 如果是红黑树,由于添加时保证树有序,则利用折半法遍历红黑树
如有不足,欢迎指出,共同进步!
你怎么能提高网页性能? 大多数开发者会通过JavaScript和图片来优化,通过服务器...
下载传送门 https://npm.taobao.org/mirrors/git-for-windows/ 第一步:双击下载...
由于移动流量日趋增多,我们统计网站流量的时候,需要把移动和PC的流量分开,而...
Postman是一款功能强大的网页调试与发送网页HTTP请求的Chrome插件 Postman背景介...
获取用户信息 第一种官方不推荐 !-- 获取用户名 -- view 当前用户名{{name}} / v...
本文中介绍如何在Linux系统上为ssh登录设置电子邮件提醒。以接收有关对root用户...
据外媒报道,微软周一表示,水下数据中心是一个发展方向,在其研究人员将其实验...
目录 数据类型 运算符 本篇博客主要介绍Java语言中的数据类型与运算符。 数据类...
昨天同事问了我一个问题,有两个循环语句: 复制代码 代码如下: for(i = n; i 0;...
数码管静态显示0~f · 现学现卖138译码器什么的就不多说了都是看视频学的我主要...