HashMap源码分析
HashMap在面试和工作中使用很多。
Hash,一般翻译做"散列",也有直接音译为"哈希"的,就是把任意长度的输入(又叫做预映射, pre-image),通过散列算法,变换成固定长度的输出,该输出就是散列值。这种转换是一种压缩映射,也就是,散列值的空间通常远小于输入的空间,不同的输入可能会散列成相同的输出,所以不可能从散列值来唯一的确定输入值。简单的说就是一种将任意长度的消息压缩到某一固定长度的消息摘要的函数。 HASH函数(计算机算法领域) 概述 HashMap是Map接口下一个线程不安全的,基于哈希表的实现类,它解决冲突的方法是链表法,所以它的数据结构是数组+链表 JDK1.8之后的数据结构则变为数组 + 链表 + 红黑树
HashMap有两个参数影响其性能:初始容量和扩容因子。默认初始容量是16,加载因子是0.75。
initialCapacity 初始容量,通过tableSizeFor计算会返回一个比给定整数大且最接近的2的幂次方整数,并赋值给threshold
默认初始容量为16,必须为2的幂
loadFactor 扩容因子 默认为DEFAULT_LOAD_FACTOR 即0.75(在0.75属于时间和空间的一个平衡)
当容量一定是2^n时,h & (length - 1) == h % length
MIN_TREEIFY_CAPACITY:
是指当桶被转化为树形结构的时候,此时桶所拥有的最小容量
MAXIMUM_CAPACITY = 1 << 30;这是定义容量的最大值。
public HashMap()// 默认构造函
public HashMap(int initialCapacity, float loadFactor) / /指定“容量大小”和“加载因子”的构造函数
public HashMap(int initialCapacity) // 指定“容量大小”的构造函数
public HashMap(Map<? extends K, ? extends V> m) // 包含“子Map”的构造函数,将m中的全部元素逐个添加到HashMap中
哈希冲突的解决方法:开放地址法,链地址法,公共溢出法,再哈希法
小结
(1) 扩容是一个特别耗性能的操作,所以当程序员在使用HashMap的时候,估算map的大小,初始化的时候给一个大致的数值,避免map进行频繁的扩容。
(2) 负载因子是可以修改的,也可以大于1,但是建议不要轻易修改,除非情况非常特殊。
(3) HashMap是线程不安全的,不要在并发的环境中同时操作HashMap,建议使用ConcurrentHashMap。
(4) JDK1.8引入红黑树大程度优化了HashMap的性能。
原文地址:https://www.cnblogs.com/kai-114514/p/15107269.html
- 北京青年报:用数据说话应是网络强国标配
- 3字母域名谁不爱?游戏门户启用价值六位数的域名
- 中国版Space X首台“民营火箭”发动机试车成功;贾跃亭甘薇在美欢度圣诞,证监局喊破嗓子他也不回家;谷歌AI新技能
- 我的写作工具链
- 微信小程序更新新能力:四大功能让小程序更火爆!一起来了解更新吧,快来学习吧
- CentOS下ssh免密码问题
- flask-script
- 仿照wtform自定义Form组件
- 神速!一域名注册不到两个月就被启用
- Django中的信号
- 惊爆!小程序连发7种新能力,开直播、连Wi-Fi、分包加载……你们想要的都来了!
- 浅淡python中with的用法,上下文管理器
- 国家档案局:“大数据”时代我国档案工作要加快转型升级
- 大庆的实体店为什么一定要做小程序?
- 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 数组属性和方法
- Modbus协议
- client-go连接K8s集群进行pod的增删改查
- [895]Clickhouse
- 使用goaccess分析nginx日志
- 一文搞懂 Flink如何移动计算
- 第7章代码-真实感图形技术
- 第6章代码-三维造型
- 自定义组件使用v-model
- 金蝶K3 WISE版本过服务期后打补丁方法-完善版本
- 图像处理笔记(6)---- OpenCV waitKey函数
- SpringBoot整合Quartz作为调度中心完整实用例子
- SpringBoot整合SpringSecurity简单实现登入登出从零搭建
- SpringBoot整合SpringBatch实用简例
- 解决JPA懒加载典型的N+1问题-注解@NamedEntityGraph
- 基于Shiro,JWT实现微信小程序登录完整例子