简单剖析Hashmap
剖析 Java Hashmap 源码
在 Java 的集合框架中,HashMap 是一颗璀璨的明珠。通过深入挖掘其源码,我们将揭开 HashMap 的神秘面纱,理解其底层原理、扩容机制和数据结构。
1. HashMap 源码导读
我们首先来看一段简单的代码,创建一个空的 HashMap:
import java.util.HashMap;
public class HashMapSource {
public static void main(String[] args) {
// 创建一个空的 HashMap
HashMap<String, Integer> map = new HashMap<>();
}
}
2. HashMap 底层原理 - 数组与链表
HashMap 的底层结构是一个数组,每个数组元素是一个链表的头节点。当我们添加键值对时,首先计算键的哈希码,然后通过哈希码找到对应的数组索引。如果发生哈希冲突,即不同键的哈希码映射到同一个索引,就在该索引处形成一个链表。这就是链表法处理碰撞的方式。
下面是一个简化的示例,演示了如何计算哈希码和确定数组索引:
import java.util.HashMap;
public class HashingExample {
public static void main(String[] args) {
HashMap<String, Integer> map = new HashMap<>();
// 计算键 "Alice" 的哈希码
int hash = "Alice".hashCode();
// 根据哈希码确定数组索引
int index = hash & (map.size() - 1);
System.out.println("键 \"Alice\" 的哈希码: " + hash);
System.out.println("对应的数组索引: " + index);
}
}
3. 扩容机制 - Ensuring Capacity
HashMap 在扩容时,会将数组的长度翻倍,并重新计算每个元素的索引。这一过程在 resize() 方法中实现。我们看一下简化版本的代码:
import java.util.HashMap;
public class ResizeExample {
public static void main(String[] args) {
HashMap<String, Integer> map = new HashMap<>(16);
// 添加键值对,触发扩容
map.put("Alice", 95);
map.put("Bob", 87);
map.put("Charlie", 92);
}
}
在这个例子中,初始容量为 16,当添加第四个键值对时,触发了扩容操作。
4. 数据结构 - Node 类的奥秘
HashMap 的每个键值对都存储在一个 Node 类的实例中。这个类有 hash、key、value 和 next 四个字段,用于保存哈希码、键、值以及下一个节点的引用。以下是一个简化的 Node 类:
class Node<K, V> {
final int hash;
final K key;
V value;
Node<K, V> next;
Node(int hash, K key, V value, Node<K, V> next) {
this.hash = hash;
this.key = key;
this.value = value;
this.next = next;
}
}
结语
通过深入分析 HashMap 的源码,我们揭示了其底层原理、扩容机制和数据结构。每一行代码都是如何促使 HashMap 这个数据结构在 Java 编程中大放异彩的关键。愿你对 HashMap 有了更深层次的理解,编码的路上更加得心应手!
简单剖析Hashmap的更多相关文章
- 深入剖析HashMap
前言 很高兴遇见你~ HashMap是一个非常重要的集合,日常使用也非常的频繁,同时也是面试重点.本文并不打算讲解基础的使用api,而是深入HashMap的底层,讲解关于HashMap的重点知识.需要 ...
- 深度剖析HashMap的数据存储实现原理(看完必懂篇)
深度剖析HashMap的数据存储实现原理(看完必懂篇) 具体的原理分析可以参考一下两篇文章,有透彻的分析! 参考资料: 1. https://www.jianshu.com/p/17177c12f84 ...
- [转]C++智能指针简单剖析
C++智能指针简单剖析 https://www.cnblogs.com/lanxuezaipiao/p/4132096.html 导读 最近在补看<C++ Primer Plus>第六版 ...
- SQLSERVER性能计数器的简单剖析
SQLSERVER性能计数器的简单剖析 今晚看了这篇文章:SQL Server 2012新performance counter:非常实用的Batch Resp Statistics 文章里介绍到SQ ...
- 计算机程序的思维逻辑 (40) - 剖析HashMap
前面两节介绍了ArrayList和LinkedList,它们的一个共同特点是,查找元素的效率都比较低,都需要逐个进行比较,本节介绍HashMap,它的查找效率则要高的多,HashMap是什么?怎么用? ...
- java——HashMap的实现原理,自己实现简单的HashMap
数据结构中有数组和链表来实现对数据的存储,但是数组存储区间是连续的,寻址容易,插入和删除困难:而链表的空间是离散的,因此寻址困难,插入和删除容易. 因此,综合了二者的优势,我们可以设计一种数据结构-- ...
- 简单剖析Node中的事件监听机制(一)
使用js的class类简单的实现一个事件监听机制,不同于浏览器中的时间绑定与监听,类似于node中的时间监听,并且会在接下来的文章中去根据自己的理解去写一下Event模块中的原理. Node.js使用 ...
- Java编程的逻辑 (40) - 剖析HashMap
本系列文章经补充和完善,已修订整理成书<Java编程的逻辑>,由机械工业出版社华章分社出版,于2018年1月上市热销,读者好评如潮!各大网店和书店有售,欢迎购买,京东自营链接:http:/ ...
- 对QT中QBitArray类进行简单剖析
我们知道Qt中的QBitArray类支持在位(bit)的层次上进行数据操作.本文剖析该类在二进制文件读写时的一些要点.另外,在Qt中,QDataStream类对于二进制文件的读写提供了诸多便利,需要注 ...
- 简单谈谈HashMap
概述 面试Java基础,HashMap可以说是一个绕不过去的基础容器,哪怕其他容器都不问,HashMap也是不能不问的. 除了HashMap,还有HashTable跟ConcurrentHashMap ...
随机推荐
- IoC入门案例
1.管理什么?(Service和Dao) 2.如何将被管理的对象告知IoC容器?(配置) 3.被管理的对象交给IoC容器,如何获取IoC容器?(接口) 4.IoC容器得到后,如何从容器中获取到bean ...
- 欧奈尔的RPS指标如何使用到股票预测
前言 1988年,欧奈尔将他的投资理念写成了<笑傲股市How to Make Money in Stocks>.书中总结了选股模式CANSLIM模型,每一个字母都代表一种尚未发动大涨势的潜 ...
- bash shell笔记整理——tail命令
作用 Print the last 10 lines of each FILE to standard output. With more than one FILE, precede each wi ...
- linux rz/sz 拖动文件上传
不需要第三方上传文件直接 rz上传 拖动.以及 sz下载文件 多舒服 那么 他来了 安装与使用 yum安装 yum -y install lrzsz 使用上传文件,执行命令rz,会跳出文件选择窗口,选 ...
- 使用NPOI导出Excel,并在Excel指定单元格插入图片
一.添加Nuget引用 二.弹框选择保存路径 string fileName = $"记录_{DateTime.Now.ToString("yyyyMMdd_HHmmss" ...
- Java中单体应用锁的局限性&分布式锁
互联网系统架构的演进 在互联网系统发展之初,系统比较简单,消耗资源小,用户访问量也比较少,我们只部署一个Tomcat应用就可以满足需求.系统架构图如下: 一个Tomcat可以看作是一个JVM进程,当大 ...
- 去哪儿网 (Qunar) DevOps 实践分享
这是 2017 年王晓翔在 msup 全球软件案例研究峰会上的分享,重点分享了提高工程效率过程中存在的问题.取得的成果和要做的事情.内容详实,具有可操作性.我有幸看到了,所以在征得晓翔的同意下重新截图 ...
- 为什么浏览器会提示网站“不安全”?一文读懂https协议与SSL证书
[摘要] 为什么浏览器会提示网站"不安全"?从浏览器的"不安全"提示来详细了解https与SSL证书.我们打开很多http网站时候,会看到浏览器提示" ...
- 华为亮相KubeCon EU 2023 新云原生开源项目Kuasar推动“云上演进”
摘要:协力同行.拥抱开源,解放数字生产力,为社会和行业带来更多价值. 在数字时代,如果说企业是一艘巨大的货船,那么云原生则为企业的每一个业务.每一个应用提供了标准化的集装箱,摆脱笨重的底层桎梏,打造新 ...
- MySQL事务处理特性的实现原理
摘要:事务这个词来自于英语中的transactional这个词的翻译,这个词的含义更多的是指 "交易".在数据库系统或者软件系统中我们通常 称 transactional 为事务 ...