持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第8天,点击查看活动详情
哈喽,各位小伙伴们好,我是喵手。
今天我要给大家分享一些自己日常学习到的一些知识点,并以文字的形式跟大家一起交流 学习,互相学习,才能成长的更快,对吧。
我是一名java开发,所以日常接触到最多的就是java啦,所以我趁自己有空,就来好好回忆,把自己学到的会的,进行输出,不图什么有回报,只想能帮助到更多的小伙伴,就好。
小伙伴们在批阅的过程中,如果觉得文章不错,欢迎点赞、收藏、关注哦。三连即是对喵手我创作道路上最好的鼓励与支持!
一、前言
论前几期啊,我们是分别讲了Object类、Date类、FormDate类、Calendar类、System类及StringBuilder类,不知道大家掌握的如何,如果没有及时巩固的同学,可以看我这里,我给大家罗列了下,快速学习通道,只希望能帮助到大家更好的学习与成长,这就是我写作的初衷。
- java之Date类讲义
- java之DateFormat类讲义
- java之Calendar类讲义
- java之System类讲义
- java之StringBuilder类讲义
- java之Collection类
- java之包装类
- java之Iterator迭代器
- java之List集合
今天,我就要给大家讲讲一个双列集合-map。很多期内容,有小伙伴给我留言,说跟着我学,一般要看完文章才知道这一期讲了什么,所以,每一期,我都会先总结教学目标,而这期的教学目标如下:
- 学习LinkedHashMap集合的概念及特点。
- 学习LinkedHashMap存储结构。
- 学习LinkedHashMap集合常用方法及示例代码演示。
二、正文
1、概述
我们学习了map接口之HashMap集合,今天我们要来学习map接口的另一个实现类-LinkedHashMap,不知道你们还记得我在一开始介绍Map集合的时候,就有提过这个集合,它也是在日常项目开发中必须要掌握的一个双列集合,也是在日常面试中的高频题,如果你没掌握,相对面试还是处于弱势的。
听我这么一说很能很多小伙伴就会非常的好奇了,那LinkedHashMap究竟是啥?那就由我来给大家进行一个全面的讲解吧。
LinkedHashMap集合,我们先来看下它的类结构定义,请看如下:
public class LinkedHashMap<K,V> extends HashMap<K,V> implements Map<K,V>{}
不难看出,它是HashMap的子类,所以对于LinkedHashMap自然继承HashMap的所有特性。例如:linkedHashMap的元素存取过程与HashMap集合的存取过程基本类似,只是说在细节上实现会稍有不同,这也是取决于LinkedHashMap本身的特性所决定的,因为LinkedHashMap要额外维护一个双向链表。
对于LinkedHashMap,见名知意,它是具有hash散列的功能, 同时也具备元素顺序。总而言之,LinkedHashMap就是一个标准的HashMap与LinkedList的融合体。
2、特点
那我们说完LinkedHashMap,接下来肯定就要对它的特点做一个了解,这也是为了让大家更好的掌握。
- LinkedHashMap的存储单元类型使用了Entry类作为存储类,继承自HashMap的node类,Entry类添加了before和after两个前后指针。
- LinkedHashMap使用的数据结构有数组、单向链表、双向链表、红黑树。
- LinkedHashMap的初始容量大小、负载因子默认下大小、负载因子和HashMap一样。
- LinkedHashMap是非线程安全的。并发出错时,会快速失败,抛出该异常
ConcurrentModificationException。 - ... ...
3、相关源码概念解释
transient LinkedHashMap.Entry<K,V> head;
解释:头结点,同时也是最早插入的节点。
transient LinkedHashMap.Entry<K,V> tail;
解释:尾结点,同时也是最后插入的节点。
static class Entry<K,V> extends HashMap.Node<K,V> {};
解释:继承 Node,为数组的每个元素增加了 before 和 after 属性。
final boolean accessOrder;
解释:控制两种访问模式的字段,默认 false。true表示:按照访问顺序,会把经常访问的 key 放到队尾。false表示:按照插入顺序提供访问
4、实例演示
接下来就是实战环节了,对于一个集合,最关心的就是它的遍历方式了,对于LinkedHashMap集合,它的遍历方式也跟HashMap遍历一致,比如通过keySet()按键取值方式,也可以根据entrySet()方法,或者就是使用Iterator迭代器。
如下我就给大家演示一下如何entrySet()方法来进行map遍历吧。像其他的遍历方式,这个就当布置课后作业自行完成了哈。
演示代码如下:
@Test
public void testLinkedHashMap() {
//创建一个LinkedHashMap集合
Map<String, String> map = new LinkedHashMap<>();
//添加元素
map.put("黄忠", "射手");
map.put("吕布", "战士");
map.put("妲己", "法师");
Set<Map.Entry<String, String>> entrySet = map.entrySet();
for (Map.Entry<String, String> entry : entrySet) {
//解析entry对象
String key = entry.getKey();
String value = entry.getValue();
System.out.println(key + "所对应的值为:" + value);
}
}
控制台输出结果:
黄忠所对应的值为:射手
吕布所对应的值为:战士
妲己所对应的值为:法师
而且,有一点,需要大家注意的,不知道大家发现了没有,LinkedHashMap输出结果跟put时顺序完全一致,这也就是证实了一点,LinkedHashMap插入是有序的(根据按插入顺序来顺序取出元素),而HashMap是无序的。
可以请大家再看个实例:如下:
... ...
好啦,以上就是本期内容的全部教学内容啦,如果对文中的任何知识点有疑问,欢迎评论区评论留言呀,我看见都会一一解答的。
三、文末
教学是结束了,但是有些话不知我但讲不当讲,啊哈哈, 可我还是想说给你们听听。如下是我很喜欢的一句话,我打算送给你们,希望我们都能变得更好更优秀。
学习不分先后,知识不分多少;事无巨细,当以虚心求教;三人行,必有我师焉!!!
wished for you successed !!!
-------------------------------------------
⭐️若喜欢我,就请关注我叭。
⭐️若对您有用,就请点赞叭。
⭐️若有疑问,就请评论留言告诉我叭。
-------------------------------------------