HashMap 之继承结构和基本方法

简介: HashMap 是 Java 中常用的数据结构之一,hash 是散列的意思,Map 有映射表的意思,于是 HashMap 就是散列表的意思,它存储的内容是键值对。Java8 之前,HashMap 在存储大量数据时,查询效率并不是非常高,但在 Java8,HashMap 的底层实现发生了一些改变,引进了一些新的技术,如当索引值大于或等于 8 时,数据结构将会由链表转换为红黑树,目的是为了提高数据的查询效率等。

HashMap 是 Java 中常用的数据结构之一,hash 是散列的意思,Map 有映射表的意思,于是 HashMap 就是散列表的意思,它存储的内容是键值对。Java8 之前,HashMap 在存储大量数据时,查询效率并不是非常高,但在 Java8,HashMap 的底层实现发生了一些改变,引进了一些新的技术,如当索引值大于或等于 8 时,数据结构将会由链表转换为红黑树,目的是为了提高数据的查询效率等。

一、HashMap 的继承结构

HashMap 实现了 Map 接口,根据键的 HashCode 值存储数据,具有很快的访问速度,最多允许一条记录的键为 null(此时哈希值为 0),不支持线程同步,HashMap 同时还继承了 AbstractMap 类,实现了 Cloneable 接口和 Serializable  接口。

HashMap继承结构图

上图中,黄色表示类(Class),绿色表示接口(Interface),实线表示继承(extends),虚线表示实现(implements)。

HashMap 一般被当作字典来使用(Map 就是字典),因此 HashMap 是无序的,即不会记录插入的顺序。但这并不代表着 Java 里面没有字典类,只不过字典类 Dictionary 已经不常用了而已。字典这种数据结构由很多的实现,在其他语言中都有类似的存在,如 C++ std 中的 Map,以及 Python 中的内置类 dict。

二、数据结构 —— 字典

我们都知道一些常用的数据结构,如数组、链表等,它们都是一维的线性数据结构,它们的展现形式大致是这样的:

数组和链表

字典实际就相当于一维线性数据结构的扩展,从一维扩展到了二维,但并不是完全的二维,它一般在二维层面上只有一对数据(两个互相关联的数据),一般可以表示为下图:

字典

再扩展一点,每对数据中不一定是存储简单的数字,也可以是一种数据结构。字典中的每对数据都是一个键值对,一个是键,一个是值,值用于存储数据,键用于查询,因此不能有重复的键,值就没有任何限制了。

三、HashMap 的基本方法

类 HashMap 位于 java.util 包中,它的常见方法如下:

方法 描述
clear 删除 HashMap 中的所有键值对
clone 复制一份 HashMap
isEmpty 判断 HashMap 是否为空
size 计算 HashMap 中键/值对的数量
put 将键/值对添加到 HashMap 中
putAll 将所有键/值对添加到 HashMap 中
putIfAbsent 如果 HashMap 中不存在指定的键,则将指定的键/值对插入到 HashMap 中
remove 删除 HashMap 中指定键 key 的映射关系
contasinsKey 检查 HashMap 中是否存在指定的 key 对应的映射关系
containsValue 检查 HashMap 中是否存在指定的 value 对应的映射关系
replace 替换 HashMap 中是指定的 key 对应的 value
replaceAll 将 HashMap 中的所有映射关系替换成给定的函数所执行的结果
get 获取指定 key 对应对 value
getOrDefault 获取指定 key 对应对 value,如果找不到 key ,则返回设置的默认值
forEach 对 HashMap 中的每个映射执行指定的操作
entrySet 返回 HashMap 中所有映射项的集合集合视图
keySet 返回 HashMap 中所有 key 组成的集合视图
values 返回 HashMap 中存在的所有 value 值
merge 添加键值对到 HashMap 中
compute 对 HashMap 中指定 key 的值进行重新计算
computeIfAbsent 对 HashMap 中指定 key 的值进行重新计算,如果不存在这个 key,则添加到 HashMap 中
computeIfPresent 对 HashMap 中指定 key 的值进行重新计算,前提是该 key 存在于 HashMap 中

举几个例子:

importjava.util.HashMap;
publicclassTest {
publicstaticvoidmain(String[] args) {
HashMap<Integer, String>hashMap=newHashMap<>();
hashMap.put(1, "Java"); // 添加键值对hashMap.put(2, "Java8"); // 添加键值对System.out.println(hashMap); // Output: {1=Java, 2=Java8}System.out.println(hashMap.get(1)); // Output: JavahashMap.remove(1); // 移除键为 1 的键值对System.out.println(hashMap.size()); // Output: 1    }
}


目录
相关文章
|
5月前
|
索引
HashMap中hash()方法的位运算
HashMap中hash()方法的位运算
HashMap中hash()方法的位运算
|
5月前
|
存储 安全 Java
HashMap的使用,以及内置方法
HashMap的使用,以及内置方法
|
2月前
|
存储 开发者 C#
WPF与邮件发送:教你如何在Windows Presentation Foundation应用中无缝集成电子邮件功能——从界面设计到代码实现,全面解析邮件发送的每一个细节密武器!
【8月更文挑战第31天】本文探讨了如何在Windows Presentation Foundation(WPF)应用中集成电子邮件发送功能,详细介绍了从创建WPF项目到设计用户界面的全过程,并通过具体示例代码展示了如何使用`System.Net.Mail`命名空间中的`SmtpClient`和`MailMessage`类来实现邮件发送逻辑。文章还强调了安全性和错误处理的重要性,提供了实用的异常捕获代码片段,旨在帮助WPF开发者更好地掌握邮件发送技术,提升应用程序的功能性与用户体验。
40 0
|
2月前
|
存储 Java 开发者
揭秘!HashMap底层结构大起底:从数组到链表,再到红黑树,Java性能优化的秘密武器!
【8月更文挑战第24天】HashMap是Java集合框架中的核心组件,以其高效的键值对存储和快速访问能力广受开发者欢迎。在JDK 1.8及以后版本中,HashMap采用了数组+链表+红黑树的混合结构,实现了高性能的同时解决了哈希冲突问题。数组作为基石确保了快速定位;链表则用于处理哈希冲突;而当链表长度达到一定阈值时,通过转换为红黑树进一步提升性能。此外,HashMap还具备动态扩容机制,当负载因子超过预设值时自动扩大容量并重新哈希,确保整体性能。通过对HashMap底层结构的深入了解,我们可以更好地利用其优势解决实际开发中的问题。
67 0
|
3月前
|
存储 Java
Redis08命令-Hash类型,也叫散列,其中value是一个无序字典,类似于java的HashMap结构,Hash结构可以将对象中的每个字段独立存储,可以针对每字段做CRUD
Redis08命令-Hash类型,也叫散列,其中value是一个无序字典,类似于java的HashMap结构,Hash结构可以将对象中的每个字段独立存储,可以针对每字段做CRUD
|
5月前
|
存储 Java 索引
【JAVA】HashMap的put()方法执行流程
【JAVA】HashMap的put()方法执行流程
|
存储 安全 Java
HashMap底层结构、扩容机制实战探索
HashMap底层结构、扩容机制实战探索
HashMap底层结构、扩容机制实战探索
|
5月前
|
机器学习/深度学习
HashMap中tableSizeFor()方法详解
HashMap中tableSizeFor()方法详解
HashMap中tableSizeFor()方法详解
HashMap中put()方法源码详解
HashMap中put()方法源码详解
|
5月前
|
设计模式 Java
结构性模式之---组合模式、HashMap源码剖析
结构性模式之---组合模式、HashMap源码剖析