咦咦咦,各位小可爱,我是你们的好伙伴------bug菌,今天又来给大家普及Java SE相关知识点了,别躲起来啊,听我讲干货还不快点赞,赞多了我就有动力讲得更嗨啦!所以呀,养成先点赞后阅读的好习惯,别被干货淹没了哦~
🏆本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,助你一臂之力,带你早日登顶🚀,欢迎大家关注&&收藏!持续更新中,up!up!up!!
js
环境说明:Windows 10 + IntelliJ IDEA 2021.3.2 + Jdk 1.8
前言
Java是一种面向对象的编程语言,集合类是在Java编程中常用的一种数据结构,包括数组和集合。在Java中,集合类可以用来存储和操作一组对象数据,是Java编程中不可或缺的一部分。在本文中,我们将详细介绍Java中一个常用的集合类:LinkedHashMap。
摘要
本文将重点介绍LinkedHashMap这一集合类的应用和实践。我们将从源代码解析开始,详细介绍LinkedHashMap的实现方式和内部结构。接着,我们将通过实际应用场景案例和优缺点分析,深入剖析LinkedHashMap的特点和适用范围。最后,我们将给出LinkedHashMap类的代码和方法介绍,并提供测试用例,让读者更好地掌握该类的使用方法。
LinkedHashMap
简介
LinkedHashMap是Java中常用的一种Map集合类,它基于哈希表和链表实现,可以保证存储和取出元素的顺序是相同的。与HashMap不同的是,LinkedHashMap还维护了一个双向链表,用于记录元素插入的顺序。
源代码解析
LinkedHashMap继承了HashMap类,因此它的底层结构也是基于哈希表实现的。不同的是,在LinkedHashMap中,每个元素还有两个指针:一个指向前驱元素,一个指向后继元素。这样就可以通过这些指针来维护元素的插入顺序。
在LinkedHashMap中,元素插入时会先在哈希表中寻找元素所在的位置,然后再将该元素插入到双向链表的尾部。因此,在遍历LinkedHashMap时,元素的顺序就是插入的顺序。
LinkedHashMap是一个基于HashMap实现的有序哈希表,它维护着一个双向链表来保证元素的顺序。在遍历时,LinkedHashMap可以按照插入顺序或者访问顺序进行遍历。
LinkedHashMap的源代码解析:
内部类Entry继承自HashMap中的静态内部类Node,用于表示链表节点
java
static class Entry<K,V> extends HashMap.Node<K,V> {
Entry<K,V> before, after;
Entry(int hash, K key, V value, Node<K,V> next) {
super(hash, key, value, next);
}
}
代码解析:
这段代码定义了一个泛型静态类 Entry,它继承了 HashMap.Node 类。Entry 类有四个属性:
-
int 类型的 hash,用于存储键的哈希值;
-
K 类型的 key,用于存储键对象;
-
V 类型的 value,用于存储值对象;
-
Node<K,V> 类型的 next,用于存储下一个节点。
除此之外,Entry 类还有两个指向前后节点的引用 before 和 after。这些引用被用于实现链表结构,以便在发生冲突(即哈希冲突)的时候用于维护桶中的节点链表。
Entry 类的构造函数接受四个参数,分别是哈希值、键对象、值对象和下一个节点。当创建一个新节点时,这些参数会被传递给构造函数以初始化节点的属性。
如下是部分源码截图:
应用场景案例
LinkedHashMap适用于需要按照插入顺序或者访问顺序来遍历元素的场景。比如,一个缓存系统中,当缓存到达容量上限时,需要删除最近最少使用的元素,这就可以通过LinkedHashMap的访问顺序来实现。
另一个应用场景是把元素插入到集合中后再执行删除操作,此时可以通过LinkedHashMap的插入顺序来精确控制删除的顺序。
优缺点分析
LinkedHashMap的优点在于它能保证元素的顺序,而且在访问元素时比HashMap效率更高。另外,LinkedHashMap还可以指定元素访问顺序(按照访问时间,从最近访问的元素开始遍历)。
缺点在于,由于维护了双向链表,LinkedHashMap的空间占用比HashMap更大。此外,LinkedHashMap的插入和删除操作比HashMap慢一些。
类代码方法介绍
以下是LinkedHashMap类的主要方法:
- put(Object key, Object value):将键值对插入到LinkedHashMap中。
- get(Object key):根据键获取对应的值。
- remove(Object key):根据键删除元素。
- clear():清空所有元素。
- size():返回元素个数。
- entrySet():返回LinkedHashMap中所有元素的Set视图。
代码分析:
该段代码并没有实现LinkedHashMap类的主要方法,只是列出了该类的主要方法的名称和作用。下面对每个方法的作用进行简单的解释:
- put(Object key, Object value):将给定的键值对插入到LinkedHashMap中。
- get(Object key):根据给定的键获取对应的值。
- remove(Object key):根据给定的键删除对应的元素。
- clear():清空LinkedHashMap中的所有元素。
- size():返回LinkedHashMap中元素的个数。
- entrySet():返回LinkedHashMap中所有元素的Set视图,即一个包含所有元素的Set对象。
测试用例
以下是一个简单的LinkedHashMap测试用例,使用put方法将元素插入到集合中,然后使用entrySet方法遍历所有元素,并输出元素的键和值:
java
package com.demo.javase.day68;
import java.util.LinkedHashMap;
import java.util.Map;
/**
* @Author bug菌
* @Date 2023-11-06 12:30
*/
public class LinkedHashMapTest {
public static void main(String[] args) {
LinkedHashMap<Integer, String> linkedHashMap = new LinkedHashMap<>();
linkedHashMap.put(1, "apple");
linkedHashMap.put(4, "banana");
linkedHashMap.put(2, "orange");
linkedHashMap.put(3, "pear");
for (Map.Entry<Integer, String> entry : linkedHashMap.entrySet()) {
System.out.println("key: " + entry.getKey() + ", value: " + entry.getValue());
}
}
}
测试结果
根据如上测试用例,本地测试结果如下,仅供参考,你们也可以自行修改测试用例或者添加更多的测试数据或测试方法,进行熟练学习以此加深理解。
输出结果如下:
java
key: 1, value: apple
key: 4, value: banana
key: 2, value: orange
key: 3, value: pear
测试代码分析
根据如上测试用例,在此我给大家进行深入详细的解读一下测试代码,以便于更多的同学能够理解并加深印象。
这段代码演示了如何使用Java中的LinkedHashMap类。LinkedHashMap是HashMap类的子类,它在HashMap的基础上维护了一个双向链表,因此可以按照插入顺序遍历元素。
在main方法中,我们首先创建了一个LinkedHashMap对象linkedHashMap,并向其中插入了4个键值对。然后使用for循环遍历linkedHashMap中的每一个元素,并输出其键和值。由于LinkedHashMap会按照插入顺序维护链表,因此遍历的顺序与插入顺序相同。
最终的输出结果为:
key: 1, value: apple key: 4, value: banana key: 2, value: orange key: 3, value: pear
小结
本文介绍了Java中常用的一种Map集合类:LinkedHashMap。我们从源代码解析开始,详细介绍了它的实现方式和内部结构。接着,我们通过实际应用场景案例和优缺点分析,深入剖析了LinkedHashMap的特点和适用范围。最后,我们给出了LinkedHashMap类的方法介绍和测试用例,希望读者能够更好地掌握LinkedHashMap的使用方法。
总结
LinkedHashMap是Java中常用的一种Map集合类,它能够按照插入顺序或者访问顺序来遍历元素,适用于需要精确控制元素顺序的场景。虽然LinkedHashMap的空间占用比HashMap更大,但它在访问元素时比HashMap效率更高,同时还可以指定元素访问顺序(按照访问时间)。
总之,LinkedHashMap是Java编程中一个非常实用的集合类,可以帮助我们更好地管理和操作一组对象数据。在实际应用中,我们要根据具体需求选择不同的集合类,以达到最佳的性能和效率。
... 好啦,这期的内容就基本接近尾声啦,若你想学习更多,可以参考这篇专栏总结《「滚雪球学Java」教程导航帖》,本专栏致力打造最硬核 Java 零基础系列学习内容,🚀打造全网精品硬核专栏,带你直线超车;欢迎大家订阅持续学习。
附录源码
如上涉及所有源码均已上传同步在「Gitee」,提供给同学们一对一参考学习,辅助你更迅速的掌握。
☀️建议/推荐你
无论你是计算机专业的学生,还是对编程有兴趣的小伙伴,都建议直接毫无顾忌的学习此专栏「滚雪球学Java」,bug菌郑重承诺,凡是学习此专栏的同学,均能获取到所需的知识和技能,全网最快速入门Java编程,就像滚雪球一样,越滚越大,指数级提升。
最后,如果这篇文章对你有所帮助,帮忙给作者来个一键三连,关注、点赞、收藏,您的支持就是我坚持写作最大的动力。
同时欢迎大家关注公众号:「猿圈奇妙屋」 ,以便学习更多同类型的技术文章,免费白嫖最新BAT互联网公司面试题、4000G pdf电子书籍、简历模板、技术文章Markdown文档等海量资料。
📣关于我
我是bug菌,CSDN | 掘金 | infoQ | 51CTO 等社区博客专家,历届博客之星Top30,掘金年度人气作者Top40,51CTO年度博主Top12,华为云 | 阿里云| 腾讯云等社区优质创作者,全网粉丝合计15w+ ;硬核微信公众号「猿圈奇妙屋」,欢迎你的加入!免费白嫖最新BAT互联网公司面试题、4000G pdf电子书籍、简历模板等海量资料。