【Java百炼成神】双生武魂——HashMap、LinkedHashMap、Hashtable

简介: 【Java百炼成神】双生武魂——HashMap、LinkedHashMap、Hashtable

集合概述


集合:用来保存 相同类型数据 的容器,除了保存数据,又集成了较多强大功能。

我们会在下边的学习过程中,逐个学习以下集合:HashMap、LinkedHashMap、Hashtable、

在学习 HashMap时,完成对集合基本知识的学习,如HashMap遍历等


Map概述


Map 集合叫做双列集合,每个元素都由“键”、“值”两部分组成微信图片_20220530114619.png 

该集合记录的是键值对 对应关系,

通过键可以找到对应的值。比如梁山好汉的绰号与该人的对应。 微信图片_20220530114633.png


HashMap基本使用


HashMap 和 HashSet 一样,是无序的(展示顺序和存放顺序可能不同)

Map(HashMap)的使用:

创建对象时规定键和值的数据类型。

HashMap<键,值>


常用方法:

image.png

HashMap遍历


image.png

方式一:keySet():【快捷键:变量名.keySet().for】

HashMap<Integer, String> map1 = new HashMap<Integer, String>(); 
map1.put(1,"a"); 
map1.put(2,"b"); 
map1.put(3,"c"); 
//1、以 set 集合方式,获取所有的 key 
Set<Integer> set = map1.keySet(); 
//2、增强 for 遍历 set 集合,遍历出一个 key,就通过 get(key)方法获取 value 值 
for(Integer key:set){ 
 String value = map1.get(key); 
 System.out.println("key:"+key+" value:"+value); 
} 



方式二:entrySet():【快捷键:变量名.entrySet().for】

HashMap<Integer, String> map1 = new HashMap<Integer, String>(); 
map1.put(1,"a"); 
map1.put(2,"b"); 
map1.put(3,"c"); 
//1、将一个键值对封装进一个 Entry 对象,获取一个装满 Entry 对象的 set 集合 
Set<Map.Entry<Integer, String>> set = map1.entrySet(); 
//2、增强 for 遍历 set 集合,遍历出一个 Entry 对象,就相当于获取了一个键值对 
for (Map.Entry<Integer, String> entry : set) { 
 //2.1、通过 Entry 对象的 getKey()和 getValue()获取键值对 
 Integer key = entry.getKey(); 
 String value = entry.getValue(); 
 System.out.println("key:"+key+" value:"+value); 
}

练习:

使用 map 集合存储一个人的所有属性值,并完成遍历。


Map-value存储自定义类型


同其他集合一样,Map 的 key 或 value 都可以存储自定义类型对象:微信图片_20220530115139.png

建议:1、使用 value 存储自定义对象。

2、key 使用基本数据类型或 String


练习:

使用 map 集合存储系统属性名称与属性值。

使用 map 集合存储人名与个人对象,计算所有人的平均年龄,并完成遍历。


LinkedHashMap


LinkedHashMap 是有序 Map 集合。  

是在 HashMap 的基础上添加了链表结构,通过链表结构可以保证元素的存取顺序一致;微信图片_20220530115244.png

Hashtable


Hashtable 也是 Map 集合的一种已被 HashMap 取代,在很早的传统项目中会大量见到。其与 HashMap

最大的不同:

Hashtable 不支持 null 作为键或值,是安全的。

HashMap 支持 null 作为键或值,是不安全的。微信图片_20220530115255.png

 集合嵌套


集合嵌套并不是一个新的知识点,和 if 嵌套、for 嵌套一样,仅仅是格式上的内容。

单列集合嵌套:

传智学院(List 表示)有多个分校(list 表示),每个分校有多个班级(字符串)。

微信图片_20220530115416.png

双列集合与单列集合嵌套

传智学院(Map 表示,key:分校名称、value:分校的班级集合)微信图片_20220530115420.png

双列集合嵌套

传智学院(Map 表示,key:分校名称、value:分校信息)

分校信息(Map 表示,key:班级名称、value 班级对象)微信图片_20220530115546.png

要求:

传智学院

Java 基础班 001

001 张三

002 李四

Java 就业班 001

001 王五

002 赵六

对以上数据进行对象的存储

001 张三 键值对-->定义一个 Java 基础班 001 一个 Map 集合

传智学院:存储的就是班级名称和班级的学生集合

基础班 Map<学号,姓名>

传智学院 Map<班级名称,基础班的 Map>


集合<自定义对象>-判断操作


准备工作【重要】


集合元素若为自定义对象,需要在自定义类中选中对应方法,才能进行集合元素的判断操作。

1、类中其他内容写完后,自动生成 HashCode 和 Equals 方法微信图片_20220530115649.png

2.

微信图片_20220530115658.png

3.

微信图片_20220530115704.png

4.

微信图片_20220530115709.png

5.

微信图片_20220530115716.png

ArrayList的contains判断是否包含某个元素


image.png


微信图片_20220530115956.png微信图片_20220530120005.png

前人已经为 String、Integer 等类重写过 equals 方法,我们就不用再重写了。

但如果集合中是自定义类,使用 contains 方法之前,则需要重写类的 equals 方法。


例如:定义一个 Person 类(姓名 name 和 年龄 age )。

集合中保存三个人:

小明,18

小红,19

小张,20

现在判断 【小张,20】 和 【小明,20】 是否存在于集合中

要求:姓名和年龄都相同,才是同一个人

实现:微信图片_20220530120125.png

HashSet 的 add 判断是否重复

 

HashSet 不能存储重复元素:微信图片_20220530120154.png

如果集合中是自定义类型,则必须为自定义类型重写 hashCode()和 equals()方法,HashSet 的 add 方法

才能正确去重复。

微信图片_20220530120204.png

微信图片_20220530120251.png微信图片_20220530120318.png

HashMap 的 put 键判断是否重复


我们知道,HashMap 中,put 重复的键,会使用新 value 替换旧 value。

如果键是自定义类型,自定义类型必须重写 hashCode 和 equals 方法 微信图片_20220530120402.png

相关文章
|
11月前
|
存储 缓存 监控
上网行为监控系统剖析:基于 Java LinkedHashMap 算法的时间序列追踪机制探究
数字化办公蓬勃发展的背景下,上网行为监控系统已成为企业维护信息安全、提升工作效能的关键手段。该系统需实时记录并深入分析员工的网络访问行为,如何高效存储和管理这些处于动态变化中的数据,便成为亟待解决的核心问题。Java 语言中的LinkedHashMap数据结构,凭借其独有的有序性特征以及可灵活配置的淘汰策略,为上网行为监控系统提供了一种兼顾性能与功能需求的数据管理方案。本文将对LinkedHashMap在上网行为监控系统中的应用原理、实现路径及其应用价值展开深入探究。
256 3
|
10月前
|
SQL 人工智能 Java
阿里云百炼开源面向 Java 开发者的 NL2SQL 智能体框架
Spring-ai-alibaba-nl2sql 是析言 GBI 产品在数据问答领域的一次重要开源尝试,专注于 NL2SQL 场景下的核心能力开放。
2762 48
Java之HashMap详解
本文介绍了Java中HashMap的源码实现(基于JDK 1.8)。HashMap是基于哈希表的Map接口实现,允许空值和空键,不同步且线程不安全。文章详细解析了HashMap的数据结构、主要方法(如初始化、put、get、resize等)的实现,以及树化和反树化的机制。此外,还对比了JDK 7和JDK 8中HashMap的主要差异,并提供了使用HashMap时的一些注意事项。
452 2
Java之HashMap详解
|
存储 安全 Java
Java 集合框架中的老炮与新秀:HashTable 和 HashMap 谁更胜一筹?
嗨,大家好,我是技术伙伴小米。今天通过讲故事的方式,详细介绍 Java 中 HashMap 和 HashTable 的区别。从版本、线程安全、null 值支持、性能及迭代器行为等方面对比,帮助你轻松应对面试中的经典问题。HashMap 更高效灵活,适合单线程或需手动处理线程安全的场景;HashTable 较古老,线程安全但性能不佳。现代项目推荐使用 ConcurrentHashMap。关注我的公众号“软件求生”,获取更多技术干货!
282 3
|
10月前
|
存储 安全 Java
Java 集合面试题从数据结构到 HashMap 源码剖析详解及长尾考点梳理
本文深入解析Java集合框架,涵盖基础概念、常见集合类型及HashMap的底层数据结构与源码实现。从Collection、Map到Iterator接口,逐一剖析其特性与应用场景。重点解读HashMap在JDK1.7与1.8中的数据结构演变,包括数组+链表+红黑树优化,以及put方法和扩容机制的实现细节。结合订单管理与用户权限管理等实际案例,展示集合框架的应用价值,助你全面掌握相关知识,轻松应对面试与开发需求。
470 3
|
机器学习/深度学习 人工智能 NoSQL
JAVA接入DeepSeek大模型接口开发---阿里云的百炼模型
随着大模型的越来越盛行,现在很多企业开始接入大模型的接口,今天我从java开发角度来写一个demo的示例,用于接入DeepSeek大模型,国内的大模型有很多的接入渠道,今天主要介绍下阿里云的百炼模型,因为这个模型是免费的,只要注册一个账户,就会免费送百万的token进行学习,今天就从一个简单的可以执行的示例开始进行介绍,希望可以分享给各位正在学习的同学们。
2266 3
JAVA接入DeepSeek大模型接口开发---阿里云的百炼模型
|
存储 缓存 安全
Java HashMap详解及实现原理
Java HashMap是Java集合框架中常用的Map接口实现,基于哈希表结构,允许null键和值,提供高效的存取操作。它通过哈希函数将键映射到数组索引,并使用链表或红黑树解决哈希冲突。HashMap非线程安全,多线程环境下需注意并发问题,常用解决方案包括ConcurrentHashMap和Collections.synchronizedMap()。此外,合理设置初始化容量和加载因子、重写hashCode()和equals()方法有助于提高性能和避免哈希冲突。
833 17
Java HashMap详解及实现原理
|
存储 安全 Java
java学会这些,我就入门啦!(基础篇六)HashMap、Hashtable、ConcurrentHashMap的原理与区别
java学会这些,我就入门啦!(基础篇六)HashMap、Hashtable、ConcurrentHashMap的原理与区别
|
存储 安全 Java
一天十道Java面试题----第二天(HashMap和hashTable的区别--------》sleep、wait、join)
这篇文章是关于Java面试的第二天笔记,涵盖了HashMap与HashTable的区别、ConcurrentHashMap的实现原理、IOC容器的实现方法、字节码的概念和作用、Java类加载器的类型、双亲委派模型、Java异常体系、GC如何判断对象可回收、线程的生命周期及状态,以及sleep、wait、join、yield的区别等十道面试题。
一天十道Java面试题----第二天(HashMap和hashTable的区别--------》sleep、wait、join)
下一篇
开通oss服务