面试连环炮系列(七):HashMap的put操作做了什么
时间:2019-09-24
本文章向大家介绍面试连环炮系列(七):HashMap的put操作做了什么,主要包括面试连环炮系列(七):HashMap的put操作做了什么使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
- HashMap的put操作做了什么?
HashMap的是由数组和链表构成的,JDK7之后加入了红黑树处理哈希冲突。put操作的步骤是这样的:- 根据key值计算出哈希值作为数组下标。如果数组的这个位置是空的,把k放进去,put操作就完成了。
- 如果数组位置不为空,这个元素必然是个链表。遍历链表逐一比对value,如果value在链表中不存在,就把新建节点,将value放进去,put操作完成。
- 如果链表中value存在,则替换原节点的value,put操作完成。
- 如果链表节点数已经达到8个,首先判断当前hashMap的长度,如果不足64,只进行resize,扩容table,如果达到64就将冲突的链表为红黑树。
元素在数组中的位置怎么计算出来的
采用数组长度与value的哈希值取与操作计算的,表达式:(n - 1) & hash
,n是数组长度,hash是hash(value)。红黑树有什么优势,为什么要将链表转成红黑树
红黑树的平均查找长度是log(n),长度为8的时候,平均查找长度为3,如果使用链表,平均查找长度为8/2=4。链表长度如果是小于等于6,平均查找长度6/2=3,虽然速度也很快,但是转化为树结构和生成树的时间也会耗时。什么情况下数组会扩容
当元素个数超过数组长度 * loadFactor
时,就会进行数组扩容,loadFactor的默认值为0.75。默认情况下,数组大小为16,元素个数超过16 * 0.75=12
的时候,就把数组的大小扩展一倍,即2 * 16 = 32
,重新计算每个元素在数组中的位置,这是一个非常消耗性能的操作。
参考(部分摘抄的文字版权属于原作者):
https://www.jianshu.com/p/2c7a4a4e1f53
https://www.cnblogs.com/liwei2222/p/8013367.html
https://www.cnblogs.com/williamjie/p/9358291.html
https://www.cnblogs.com/xc-chejj/p/10825676.html
鸡汤:你全心全意的付出,还不如别人的随便搞搞。
原文地址:https://www.cnblogs.com/xiaoyangjia/p/11549908.html
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- [漏洞复现] 三.CVE-2020-0601微软证书漏洞及Windows验证机制欺骗复现
- PDF文件密码破解
- Ubuntu 制作离线源
- keycloak+istio实现基于jwt的服务认证授权
- dplyr 包arrange对数据排序
- ELK 日志报警插件 ElastAlert
- 简单的源码免杀过av
- vue nextTick源码
- Kubernetes Informer机制源码解析
- @PostConstruct与@PreDestroy
- webpack插件怎么手写
- @Builder注解和@EqualsAndHashCode 注解剖析
- npm link和webpack流程
- vue mixins原理
- MySQL 5.7 特性:Online DDL