简单剖析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 ...
随机推荐
- 通过match看rust
最常见的逻辑控制流比如if-else,switch,while等常用编程语言都支持,但恰巧rust语法中没有switch,取而代之的是更加强大适用的match匹配,我们就来看看rust的match有何 ...
- flask统一异常捕获(作用:统一捕获指定的异常并返回)
flask中可以使用装饰器errorhandler来对指定的异常.状态码等统一捕获并处理. 对指定的状态码进行统一捕获 @app.errorhandler(404) # 参数e是异常的详细信息的对象, ...
- vue 2实战系列 —— 复习Vue
复习Vue 近期需要接手 vue 2的项目,许久未写,语法有些陌生.本篇将较全面复习 vue 2. Tip: 项目是基于 ant-design-vue-pro ant-design-vue-pro 由 ...
- Python——第四章:函数的递归调用
递归: 函数自己调用自己 递归如果没有任何东西拦截的话. 它默认就是一个死循环 def func() func() func() 因此递归调用的时候需要有判断,来退出循环 def func() if ...
- docker: 'buildx' is not a docker command
解决方法 sudo apt install docker-buildx-plugin
- 深入理解JavaScript堆栈、事件循环、执行上下文和作用域以及闭包
1. 堆栈 在JavaScript中,内存堆是内存分配的地方,调用栈是代码执行的地方. 原始类型的保存方式:在变量中保存的是值本身,所以原始类型也被称之为值类型. 对象类型的保存方式:在变量中保存的是 ...
- 2023-11-01:用go语言,沿街有一排连续的房屋。每间房屋内都藏有一定的现金, 现在有一位小偷计划从这些房屋中窃取现金, 由于相邻的房屋装有相互连通的防盗系统,所以小偷 不会窃取相邻的房屋, 小
2023-11-01:用go语言,沿街有一排连续的房屋.每间房屋内都藏有一定的现金, 现在有一位小偷计划从这些房屋中窃取现金, 由于相邻的房屋装有相互连通的防盗系统,所以小偷 不会窃取相邻的房屋, 小 ...
- kylin&CDH理论基础
Kylin&CDH理论基础 一.维度与度量 维度是观察数据的角度.比如电商的销售数据,可以从时间维度来观察,进一步细化时间和地区维度来观察. 度量是被聚合的统计值,也是聚合运算的结果.知道维度 ...
- 昇腾CANN DVPP硬件加速训练数据预处理,友好解决Host CPU预处理瓶
本文分享自华为云社区<昇腾CANN 7.0 黑科技:DVPP硬件加速训练数据预处理,友好解决Host CPU预处理瓶颈>,作者: 昇腾CANN . 随着人工智能的快速发展,越来越多的应用场 ...
- 让 K8s 更简单!8款你不得不知的 AI 工具-Part 1
介绍 最近,AI 引起了广泛关注,而 Kubernetes 驱动的 DevOps 也不例外.软件工程师是自动化的忠实拥护者,因此针对 Kubernetes 操作员的 AI 驱动工具自然也开始涌现. 这 ...