Java集合:HashMap
Hashmap是一个存储key-value的映射表。
优点:
- 索引数据快,查找一个数据对的时间复杂度是O(1)
- 增加、删除一个数据的时间复杂度是O(1)
- key不能重复,可以存储一个null值
存储:
- 通过key的hashcode值存储在指定数组下标中
- 用链表存储hashcode值一样,都是key不一样的数据,链表长度大于8时转换为红黑树(为了提高查询效率)
HashMap的内部结构
Hashmap封装了一个Node数组进行存储key-value的键值对,常用的get和put等都是对这个Node数组进行操作。
Node有四个属性:key、value、hash、next
- hash:32位的整数,通过key的hashcode计算出来,hash&(数组长度-1) = 元素在数组的下标
- next:指向Node节点的指针,不同的key计算出来的hash值可能是一样的,如果要存储的下标位置已经有值了,用链表将元素连起来
初始化HashMap:一开始HashMap内部是一个空的Node数组,插入数据后才会被创建
HashMap的常用操作
HashMap一开始的Node数组是空的,在第一次put元素后会默认创建一个长度为n = 16的数组
put一个key-value元素进入map中
计算key的hashcode值算出hash,得出index=hash&(长度-1),将元素存在数组[index]的位置。
有两种情况:
- index这个位置已经有key了,比如当数组的长度是16时,33&(16-1) = 1. , 1 & (16 - 1) = 1 ; key值不同,但是index一样。
这里就用到了Node的next属性,让数组index下标所在的(最后一个)元素的next指向插入的元素,
- 可以直接将元素存入数组中
通过key从map中get一个元素
计算key的hashcode值算出hash,得出index=hash&(长度-1)
有两种情况:
- 如果数组[index]的值为null,就说明不存在这个元素
- 不为null,还得比较key值,通过遍历链表(如果有的话),一个个比较key值,返回key相同的元素,或null
HashMap的优化操作
- 数组长度n永远是2的幂:hash&(n-1)是元素在数组的下标,(2的幂-1)的二进制会是一连串的1,然后与hash值进行与运算
- 与运算之后的结果永远不会超过数组的界限
- 充分的利用了hash值二进制
- 负载因子:hashmap设置了一个0.75的阈值,也就是数组中的元素数量大于数组长度的0.75时,进行数组扩容,扩展成原来的两倍
- 当数组长度不够时,会出现很多的hash冲突,就是链表很长,检索效率慢,扩容后通过hash&(n-1)会让很长的链表散开
- 链表转换成红黑树:链表长度大于8,但是数组元素数量没达到阈值,会选择将链表转换为红黑树,提高查询效率
- 要求数组长度已经大于64,避免数组扩容和链表转红黑树的冲突
- hash值的计算:hash值的前16位与key的hashcode一样,后16位由hashcode的前16位与后16位异或运算得到
- 充分利用hashcode的值,增加随机性,减少hash冲突
Java集合:HashMap的更多相关文章
- Java 集合 HashMap & HashSet 拾遗
Java 集合 HashMap & HashSet 拾遗 @author ixenos 摘要:HashMap内部结构分析 Java HashMap采用的是冲突链表方式 从上图容易看出,如果选择 ...
- Java集合---HashMap源码剖析
一.HashMap概述二.HashMap的数据结构三.HashMap源码分析 1.关键属性 2.构造方法 3.存储数据 4.调整大小 5.数据读取 ...
- [转载] Java集合---HashMap源码剖析
转载自http://www.cnblogs.com/ITtangtang/p/3948406.html 一.HashMap概述 HashMap基于哈希表的 Map 接口的实现.此实现提供所有可选的映射 ...
- Java集合--HashMap分析
HashMap在Java开发中有着非常重要的角色地位,每一个Java程序员都应该了解HashMap. 本文主要从源码角度来解析HashMap的设计思路,并且详细地阐述HashMap中的几个概念,并深入 ...
- 1.Java集合-HashMap实现原理及源码分析
哈希表(Hash Table)也叫散列表,是一种非常重要的数据结构,应用场景及其丰富,许多缓存技术(比如memcached)的核心其实就是在内存中维护一张大的哈希表,而HashMap的实现原理也常常 ...
- java集合HashMap、HashTable、HashSet详解
一.Set和Map关系 Set代表集合元素无序,集合元素不可重复的集合,Map代表一种由多个key-value组成的集合,map集合是set集合的扩展只是名称不同,对应如下 二.HashMap的工作原 ...
- Java集合——HashMap,HashTable,ConcurrentHashMap区别
Map:“键值”对映射的抽象接口.该映射不包括重复的键,一个键对应一个值. SortedMap:有序的键值对接口,继承Map接口. NavigableMap:继承SortedMap,具有了针对给定搜索 ...
- Java集合——HashMap、HashTable以及ConCurrentHashMap异同比较
0. 前言 HashMap和HashTable的区别一种比较简单的回答是: (1)HashMap是非线程安全的,HashTable是线程安全的. (2)HashMap的键和值都允许有null存在,而H ...
- java集合-HashMap
HashMap基于哈希表的 Map 接口的实现,以 key-value 的形式存在.在 HashMap 中,key-value 总是会当做一个整体来处理,系统会根据 hash 算法来来计算 key-v ...
- java集合-HashMap源码解析
HashMap 键值对集合 实现原理: HashMap 是基于数组 + 链表实现的. 通过hash值计算 数组索引,将键值对存到该数组中. 如果多个元素hash值相同,通过链表关联,再头部插入新添加的 ...
随机推荐
- alpakka-kafka(8)-kafka数据消费模式实现
上篇介绍了kafka at-least-once消费模式.kafka消费模式以commit-offset的时间节点代表不同的消费模式,分别是:at-least-once, at-most-once, ...
- Java-Dubbo学习及整合SpringBoot
Dubbo架构 Dubbo是Java的RPC框架,具有三大核心功能:面向接口的远程方法调用,智能容错和负载均衡,以及服务的自动注册和发现 Dubbo架构图: 节点角色说明: 节点 说明 Provide ...
- awk-04-流程控制
if 格式: if ( 条件 ) 语句 [ else 语句 ] 单分支 正则匹配判断 双分支 多分支 while 格式 while (条件) 语句 awk是按行处理的,每次读取一行,并遍历打印每个字段 ...
- 使用PageFactory类封装页面元素,并实现简单的登录
1.新建页面对象类LoginPage import org.openqa.selenium.WebDriver; import org.openqa.selenium.WebElement; impo ...
- GraphQL API vs REST API
REST是构建API的一种流行方法,而且比GraphQL应用更广泛,让我们看看GraphQL和REST的区别. Rest是一个概念 REST是一个事实上的架构标准,但它实际上没有规范,有大量的非官方定 ...
- Android WorkManager使用入门
WorkManager使用入门 WorkManager提供了任务调度功能,我们可以对工作进行标记或命名. 我们用一个示例来演示如何使用WorkManager.本文使用Kotlin. 入门示例 grad ...
- Python 应用爬虫下载QQ音乐
Python应用爬虫下载QQ音乐 目录: 1.简介怎样实现下载QQ音乐的过程: 2.代码 1.下载QQ音乐的过程 首先我们先来到QQ音乐的官网: https://y.qq.com/,在搜索栏上输入一首 ...
- 整理自己部署项目需要使用的Linux命令
1.修改文件名: mv test test 12.创建test文件夹: mkdir test3.解压文件至 test文件夹下: unzip test.war -d test/4.将work文件移动至 ...
- mongoose 更新数据时不验证数据(忽略设定的集合规则)的问题
问题: mongoose 更新数据时不验证数据(忽略设定的集合规则)的问题 参考: http://www.mongoosejs.net/docs/api.html#updateone_updateOn ...
- 【java web】过滤器filter
一.过滤器简介 过滤器filter依赖于servlet容器 所谓过滤器顾名思义是用来过滤的,Java的过滤器能够为我们提供系统级别的过滤,也就是说,能过滤所有的web请求, 这一点,是拦截器无法做到的 ...