深入理解HashMap和LinkedHashMap的区别
深入理解HashMap和LinkedHashMap的区别
简介
我们知道HashMap的变量顺序是不可预测的,这意味着便利的输出顺序并不一定和HashMap的插入顺序是一致的。这个特性通常会对我们的工作造成一定的困扰。为了实现这个功能,我们可以使用LinkedHashMap。
LinkedHashMap详解
先看下LinkedHashMap的定义:
public class LinkedHashMap<K,V>
extends HashMap<K,V>
implements Map<K,V>
LinkedHashMap继承自HashMap,所以HashMap的所有功能在LinkedHashMap都可以用。
LinkedHashMap和HashMap的区别就是新创建了一个Entry:
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,多了一个before,after来实现Node之间的连接。
通过这个新创建的Entry,就可以保证遍历的顺序和插入的顺序一致。
插入
下面看一个LinkedHashMap插入的例子:
@Test
public void insertOrder(){
LinkedHashMap<String, String> map = new LinkedHashMap<>();
map.put("ddd","desk");
map.put("aaa","ask");
map.put("ccc","check");
map.keySet().forEach(System.out::println);
}
输出结果:
ddd
aaa
ccc
可以看到输出结果和插入结果是一致的。
访问
除了遍历的顺序,LinkedHashMap还有一个非常有特色的访问顺序。
我们再看一个LinkedHashMap的构造函数:
public LinkedHashMap(int initialCapacity,
float loadFactor,
boolean accessOrder) {
super(initialCapacity, loadFactor);
this.accessOrder = accessOrder;
}
前面的两个参数initialCapacity,loadFactor我们之前已经讲过了,现在看最后一个参数accessOrder。
当accessOrder设置成为true的时候,就开启了 access-order。
access order的意思是,将对象安装最老访问到最新访问的顺序排序。我们看个例子:
@Test
public void accessOrder(){
LinkedHashMap<String, String> map = new LinkedHashMap<>(16, .75f, true);
map.put("ddd","desk");
map.put("aaa","ask");
map.put("ccc","check");
map.keySet().forEach(System.out::println);
map.get("aaa");
map.keySet().forEach(System.out::println);
}
输出结果:
ddd
aaa
ccc
ddd
ccc
aaa
我们看到,因为访问了一次“aaa“,从而导致遍历的时候排到了最后。
removeEldestEntry
最后我们看一下LinkedHashMap的一个特别的功能removeEldestEntry。这个方法是干什么的呢?
通过重新removeEldestEntry方法,可以让LinkedHashMap保存特定数目的Entry,通常用在LinkedHashMap用作缓存的情况。
removeEldestEntry将会删除最老的Entry,保留最新的。
ublic class CustLinkedHashMap<K, V> extends LinkedHashMap<K, V> {
private static final int MAX_ENTRIES = 10;
public CustLinkedHashMap(
int initialCapacity, float loadFactor, boolean accessOrder) {
super(initialCapacity, loadFactor, accessOrder);
}
@Override
protected boolean removeEldestEntry(Map.Entry eldest) {
return size() > MAX_ENTRIES;
}
}
看上面的一个自定义的例子,上面的例子我们创建了一个保留10个Entry节点的LinkedHashMap。
总结
LinkedHashMap继承自HashMap,同时提供了两个非常有用的功能。
本文的例子https://github.com/ddean2009/learn-java-collections
欢迎关注我的公众号:程序那些事,更多精彩等着您!
更多内容请访问 www.flydean.com
深入理解HashMap和LinkedHashMap的区别的更多相关文章
- HashMap与LinkedHashMap的区别
/** * remark: * HashMap与LinkedHashMap的区别 * 这里必须使用LinkedHashMap: * 原因 ...
- HashMap和LinkedHashMap的区别
参考:https://blog.csdn.net/a822631129/article/details/78520111 java为数据结构中的映射定义了一个接口java.util.Map;它有四个实 ...
- hashMap 和 linkedHashMap 的区别和联系
直接举例说明. 运行如下例子程序 mport java.util.HashMap; import java.util.Iterator; import java.util.LinkedHashMap; ...
- Java - HashTable、HashMap和LinkedHashMap的区别
一般情况下,我们用的最多的是HashMap,在Map 中插入.删除和定位元素,HashMap 是最好的选择.但如果您要按自然顺序或自定义顺序遍历键,那么TreeMap会更好.如果需要输出的顺序和输入的 ...
- TreeMap,HashMap,LinkedHashMap区别,很简单解释
TreeMap,HashMap,LinkedHashMap之间的区别和TreeSet,HashSet,LinkedHashSet之间的区别相似. TreeMap:内部排序. HashMap:无序. L ...
- HashMap和LinkedHashMap区别
import java.util.HashMap; import java.util.Iterator; import java.util.LinkedHashMap; import java.uti ...
- Map 综述(一):彻头彻尾理解 HashMap
转载自:https://blog.csdn.net/justloveyou_/article/details/62893086 摘要: HashMap是Map族中最为常用的一种,也是 Java Col ...
- HashMap和Hashtable的区别 源码分析
一:以前只知道HashMap和HashTable区别,死记硬背的记住HashMap 允许key value为空 而Hashtable 不允许为空 HashMap线程是非线程安全的,而Hashtable ...
- HashMap和HashSet的区别
理解HashSet及使用 HashMap和HashSet的区别是Java面试中最常被问到的问题.如果没有涉及到Collection框架以及多线程的面试,可以说是不完整.而Collection框架的问题 ...
- 深入理解HashMap+ConcurrentHashMap的扩容策略
前言 理解HashMap和ConcurrentHashMap的重点在于: (1)理解HashMap的数据结构的设计和实现思路 (2)在(1)的基础上,理解ConcurrentHashMap的并发安全的 ...
随机推荐
- 【Azure Redis 缓存】Azure Cache for Redis 是否记录具体读/写(Get/Set)或删除(Del)了哪些key呢?
问题描述 在Azure Redis的门户活动日志中,可以查看到的是对于Redis资源本身的操作.但是对于客户端连接到Redis服务后,对服务所做出的读写,或删除操作,是否有日志可以查看到呢? 问题回答 ...
- 003-Java程序流程控制
3. Java程序流程控制(重点) 程序的三种控制结构 3.1 分支结构 if, switch 3.1.1 if if 分支 根据条件(真或假)来决定执行某段代码. if分支应用场景 if 第一种形式 ...
- Linux cp命令直接覆盖不提示的方法
今天在做项目的时候需要在linux上拷贝A项目中upload目录下所有的资源到B项目中的uoload目录下,所以我就打算使用[cp]命令拷贝过去,拷贝的时候我加了[-f]参数了,但还是一个个的询问我是 ...
- XAF新手入门 - XAF设计模式探讨
前言 刚接触XAF的小伙伴可能会有一个疑惑,XAF中有Model(BusinessObject).View.Controller,感觉明显是一个MVC的设计模式,但当你用MVC的设计模式与其对应时,又 ...
- 我为什么使用Linux做开发
系统选择 目前市面上主流的桌面操作系统在大多数人眼里只有Windows和MacOS,那为什么我没选择它们两呢? 首先,不选MacOS的原因,就是太贵.当然这是我的原因不是苹果的原因,我最早使用Linu ...
- JS3-高级事件
获取事件和处理事件的第二种方式:事件监听 如何获取和处理鼠标与键盘的基本事件? 事件监听方式 eventTarget.addEventListener(type,listener[,useCaptur ...
- 轻松驾驭Python格式化:5个F-String实用技巧分享
F-String(格式化字符串字面值)是在Python 3.6中引入的,它是一种非常强大且灵活的字符串格式化方法. 它允许你在字符串中嵌入表达式,这些表达式在运行时会被求值并转换为字符串,这种特性使得 ...
- mongo Payload document size is larger than maximum of 16777216. 如何处理
MongoDB中的文档大小限制为16MB(即16777216字节).如果你遇到Payload document size is larger than maximum of 16777216的错误,意 ...
- 玩转Vue3之shallowRef和shallowReactive
前言 Vue3 作为一款现代的 JavaScript 框架,引入了许多新的特性和改进,其中包括 shallowRef 和 shallowReactive.这两个功能在Vue 3中提供了更加灵活和高效的 ...
- Python爬虫实战系列2:虎嗅网24小时热门新闻采集
一.分析页面 打开虎嗅网,点击[24小时] 本次采集,我们以这24小时的热门新闻为案例. 1.1.分析请求 F12打开开发者模式,然后点击Network后点击任意一个请求,Ctrl+F开启搜索,输入标 ...