jdk1.8 hashmap源码阅读

目录

hashmap 成员变量

hashmap支持null键吗?为什么?

当扩容的时候,所有元素都会重新计算hash值吗?

怎么减少扩容次数

为什么node数组的大小是2的n次?

1.8和1.7的区别

1.8为啥要用红黑树?

扩容机制不一样

在使用HashMap的过程中我们应该注意些什么问题?


补发一下积灰的文章。

hashmap 成员变量

  • DEFAULT_INITIAL_CAPACITY:默认初识表格的容量,值为 16,必须是 2 的 n 次方;
  • DEFAULT_LOAD_FACTOR:默认加载因子,值为 0.75;
  • loadFactor: 加载因子,可以通过构造函数设置 loadFactory;
  • threshold:阈值,当 hash 表的 size 大于这个值得时候,需要进行 resize 扩容操作,公式是 capacity * load factor;
  • entrySet:缓存 entrySet() 方法的数据,可以对键或者值进行遍历。
  • MIN_TREEIFY_CAPACITY:节点转换成红黑树需要的最少的表格容量,值是 64;
  • TREEIFY_THRESHOLD:判断节点是否需要转成红黑树节点,值是 8;
  • UNTREEIFY_THRESHOLD:判断是否需要调用 untreeify 方法,值是 6。

hashmap成员变量https://www.jianshu.com/p/c91dc4baf69f

hashmap支持null键吗?为什么?

    static final int hash(Object key) {
        int h;
        return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);
    }

hashmap支持null键,null key 对应的hash值就是0 存放在 第0个桶里面。

而其他key 需要先调用 hashcode 再和右移16位的值进行异或。

可以通过 tab[i = (n - 1) & hash]) 直接访问到该元素在table中处于的位置。

当扩容的时候,所有元素都会重新计算hash值吗?

不会,因为第一次put的时候已经计算过hash值了,在扩容的时候 只需要和 新的tablesize相与即可知道rehash的结果。

怎么减少扩容次数

如果提前知道自己的map中的元素数量的话,比如最多1024个元素,那么可以设置hashmap的容量为1024,也就是node数组的大小为1024,设置装载因子为1,这样即使所有的数据都存入hashmap,也不会触发扩容机制。

为什么node数组的大小是2的n次?

1 可以将hash值& len-1 得到对应的索引位置。

2 在扩容的时候只需要和 新的tablesize 相与即可知道rehash的结果。

1.8和1.7的区别

JDK8 中对算哈希值的哈希算法进行了简化以提高运算效率

1.8为啥要用红黑树?

因为链表的插入效率倒是高 头插但是查找效率低,所以用树去做优化, 提升查找和查询的效率。

扩容机制不一样

在使用HashMap的过程中我们应该注意些什么问题?

1. HashMap 的扩容机制是很影响效率的,所以如果事先能确定有多少个元素需要存储,那么建议在初始化HashMap 时对数组的容量也进行初始化,防止扩容。
2. HashMap 中使用了对象的 hashcode 方法,而且很关键,所以再重写对象的 equals 时建议一定要重写hashcode 方法。
3. 如果是用对象作为 HashMap key ,那么请将对象设置为 final ,以防止对象被重新赋值,因为一旦重新赋值其实就代表了一个新对象作为了 key ,因为两个对象的 hashcode 可能不同。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

右值引用和移动语句(C++11)

左值引用和右值引用 回顾引用 我们之前就了解到了左值引用,首先我们要了解引用在编译器底层其实就是指针。具体来说,当声明引用时,编译器会在底层生成一个指针来表示引用,但在代码编写和使用时,我们可以像使用变量类…

面试题:MySQL为什么选择B+树作为索引结构

文章目录 前言二、平衡二叉树(AVL):旋转耗时三、红黑树:树太高四、B树:为磁盘而生五、B树六、感受B树的威力七、总结 前言 在MySQL中,无论是Innodb还是MyIsam,都使用了B树作索引结构(这里不考虑hash等其他索引)。本文…

一缕青丝寄相思

10年8月16日七夕节男孩向女孩表白,女孩不知道那天是七夕,也没有读懂男孩的爱,女孩在9月22日中秋,向男孩打开了心门,男孩却没有懂女孩的心思.13年后的一封问候邮件,一束女孩的长发和回不去的青春 洒满阳光的午后 转眼间看到你的笑脸 微笑着你对我说 遇上你认识我真好 你说得好莫…

数据结构与算法(Java) -单调队列单调栈题单

单调队列(灵神笔记) 239 滑动窗口最大值 239. 滑动窗口最大值 - 力扣(LeetCode) 给你一个整数数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗…

找不到DNS地址的解决方案

找不到DNS地址的解决方案 第一种解决方案:刷新DNS缓存第二种解决方案: 配置Internet协议版本4(TCP/IPv4)配置IP地址配置DNS地址 如何查看本机IPv4地址、子网掩码与默认网关 第一种解决方案:刷新DNS缓存 WINR输入cmd回…

对比ProtoBuf和JSON的序列化和反序列化能力

1.序列化能力对比验证 在这里让我们分别使用PB与JSON的序列化与反序列化能力,对值完全相同的一份结构化数据进行不同次数的性能测试。 为了可读性,下面这一份文本使用JSON格式展示了需要被进行测试的结构化数据内容: {"age" : 20,"name…

2023年第十二届数学建模国际赛小美赛A题太阳黑子预测求解分析

2023年第十二届数学建模国际赛小美赛 A题 太阳黑子预测 原题再现: 太阳黑子是太阳光球上的一种现象,表现为比周围区域暗的暂时斑点。它们是由抑制对流的磁通量浓度引起的表面温度降低区域。太阳黑子出现在活跃区域内,通常成对出现&#xff…

Android自定义View实现八大行星绕太阳转动效果

最近尝试使用Android自定义View实现了一个8大行星绕太阳转动的自定义View效果,效果静态图如下所示: 还没来得及对该效果进行比较通用的包装,仅仅实现效果,有兴趣的可以继续扩展、美化、包装一下。 核心代码就一个类PlanetsView。 …

js中setinterval怎么用?怎么才能让setinterval停下来?

setinterval()是定时调用的函数,可按照指定的周期(以毫秒计)来调用函数或计算表达式。 setinterval()的作用是在播放动画的时,每隔一定时间就调用函数,方法或对象。 setInterval() 方法会不停地调用函数,…

Stm32F401RCT6内部FLASH数据擦除读写方法

Stm32F401RCT6内部FLASH数据的分区和F103的已经不一样了,读写格式化的方法网上内容不多,自己摸索了一下,基本可以,还存在一个问题 读取: uint16_t f[5];uint8_t tx[10];f[0] *(volatile uint16_t*)0x08020000; //ST…

tar文件覆盖漏洞 CVE-2007-4559

文章目录 前言原理例题 [NSSRound#7 Team]新的博客方法一 手搓文件名方法二 python脚本 前言 做到[NSSRound#6 Team]check(Revenge)时发现是tar文件覆盖,但是对概念和执行过程理解不够深就光光记住脚本,所以在做本题[NSSRound#7 Team]新的博客时打算重新…

一个网站,四种创建制作电子期刊的方法

想象一下,你正在走进一家神奇的商店,里面陈列着各种精美的杂志和期刊。但是,这些杂志和期刊并不是印刷品,而是可以直接在网站上制作和发布的电子期刊。 但是像这样能在网上发的电子期刊该怎么制作呢?不知道如何制作的小…

cc-product-waterfall仿天猫、淘宝购物车店铺商品列表组件

cc-product-waterfall仿天猫、淘宝购物车店铺商品列表组件 引言 在电商应用中,购物车体验的优化对于提升用户满意度和转化率至关重要。在本文中,我们将深入探讨如何使用cc-product-waterfall组件,结合uni-number-box和xg-widget,…

『Nginx安全访问控制』利用Nginx实现账号密码认证登录的最佳实践

📣读完这篇文章里你能收获到 如何创建用户账号和密码文件,并生成加密密码配置Nginx的认证模块,实现基于账号密码的登录验证 文章目录 一、创建账号密码文件1. 安装htpasswd工具1.1 CentOS1.2 Ubuntu 二、配置Nginx三、重启Nginx 在Web应用程…

Linux驱动开发学习笔记1《字符设备驱动开发》

目录 一、字符设备驱动简介 二、chrdevbase 字符设备驱动开发实验 1.创建驱动程序的目录 2.创建vscode工程 3.编写实验程序 4.编译驱动程序和测试APP代码 (1)加载驱动模块 (2)创建设备节点文件 (3&#xff…

【开源】前后端分离的在线考试系统,支持多种部署方式

在线考试系统 https://download.csdn.net/download/mo3408/88593116 在线考试系统是一种利用网络技术,实现在线出题、答题、阅卷、成绩查询等一系列考试活动的系统。它不受地理位置限制,可以实现远程考试,大大提高了考试的效率和便利性。此…

HBASE命令行查看中文字符

问题记录 中文显示的是编码字符不方便查看value\xE5\xB8\xB8\xE5\xAE\x89\xE5\xAE\x891修改前中文显示: 解决方法 1、列族 : 列名 : toString ’2、列族 : 列名 : c(org.apache.hadoop.hbase.util.Bytes).toString ’ scan karry:student,{COLUMNS > [info:…

C-语言每日刷题

目录 [蓝桥杯 2015 省 A] 饮料换购 题目描述 输入格式 输出格式 输入输出样例 # [蓝桥杯 2023 省 A] 平方差 题目描述 输入格式 输出格式 输入输出样例 说明/提示 【样例说明】 [NOIP2001 普及组] 数的计算 题目描述 输入格式 输出格式 输入输出样例 说明/提示 样例 1 解释 数据…

SQL自学通之简介

目录 一、SQL 简史 二、数据库简史 1、Dr. Codds 对关系型数据库系统的十二条规则 2、设计数据库的结构 3、数据库的前景 4、对于什么是客户机/服务器型电脑系统 BernardH.Boar的定义如下: 5、交互式语言 6、易于实现 7、SQL 总览 三、流行的 SQL 开发工具…

python初始化矩阵相关

做算法题经常需要初始化一个二维的dp数组 下面两种方法是最常用的 matrix [[0]*n]*n matrix [[0]*n for _ in range(n)]以前经常混用也没发现什么问题,直到昨天debug的时候发现第一种初始化之后对矩阵进行赋值时混乱的,比如matrix[0][1]2会导致所有行…
最新文章