JAVA中的有序hash

简介: 一.hashMap与linkedHashMap经过两篇文章的讨论,已经可以清楚的知道hashmap利用hash算法将数据均匀分布。这种分布是无序的,即放入顺序和读取顺序不一致。那么JAVA中有没有又是基于hash又是有序的数据结构喃?有!它就是——linkedHashMap。

一.hashMap与linkedHashMap

经过两篇文章的讨论,已经可以清楚的知道hashmap利用hash算法将数据均匀分布。这种分布是无序的,即放入顺序和读取顺序不一致。那么JAVA中有没有又是基于hash又是有序的数据结构喃?有!它就是——linkedHashMap。

hashMap:

20190725135604818.png

linkedHashMap:

20190725135641577.png

二.如何实现有序

linkedhashMap实现有序是使用了经典的一种数据结构——双向链表。

每个节点拥有前后指针,指向直接前驱,直接后继,尾节点的尾指针直接指向头节点。

节点在链表上的顺序就是插入顺序

20190725140217996.png

三.源码

首先可以看到linkedhashmap继承了hashmap,也就是说它就是基于hashmap实现的。

20190725140903387.png

不同的地方是,linkedhashmap的内部节点内基于hashmap的内部节点类多了前后指针。

20190725141031123.png

linkedhashmap没有重写put方法,一个元素put进来,还是调用hashmap的put方法。

可以看到hashmap在put的时候分情况分别会调用几个方法。

20190725142708132.png

这几个方法hashmap只给出了空实现,并且在注释上面清楚的写明,是为了linkedhashmap所留

20190725143048901.png

然后linkedhashmap重写了这些方法,主要就是拿来操作前后指针,在put的时候指向前后节点

2019072514315480.png

遍历的时候会发现linkedhashMap重写了Iterator,其实过程就是next  next  next....

20190725143858197.png

至于构造方法中的那个标志位的作用就是拿来切换linkedhashmap的两种读取顺序而已。详细内容可以查询API。

目录
相关文章
|
5月前
|
存储 Java
深入探讨了Java集合框架中的HashSet和TreeSet,解析了两者在元素存储上的无序与有序特性。
【10月更文挑战第16天】本文深入探讨了Java集合框架中的HashSet和TreeSet,解析了两者在元素存储上的无序与有序特性。HashSet基于哈希表实现,添加元素时根据哈希值分布,遍历时顺序不可预测;而TreeSet利用红黑树结构,按自然顺序或自定义顺序存储元素,确保遍历时有序输出。文章还提供了示例代码,帮助读者更好地理解这两种集合类型的使用场景和内部机制。
68 3
|
5月前
|
存储 Java 开发者
HashSet和TreeSet教你重新认识Java集合的无序与有序
【10月更文挑战第14天】本文深入探讨了Java集合框架中的HashSet和TreeSet,解析了它们分别实现无序和有序存储的机制。通过理解HashSet基于哈希表的无序特性和TreeSet利用红黑树实现的有序性,帮助开发者更好地选择合适的集合类型以满足不同的应用场景。
72 2
|
9月前
|
存储 Java 测试技术
滚雪球学Java(67):深入理解 TreeMap:Java 中的有序键值映射表
【6月更文挑战第21天】🏆本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!
74 2
|
8月前
|
安全 Java 开发者
探索Java内存模型:可见性、有序性和并发
在Java的并发编程领域中,内存模型扮演了至关重要的角色。本文旨在深入探讨Java内存模型的核心概念,包括可见性、有序性和它们对并发实践的影响。我们将通过具体示例和底层原理分析,揭示这些概念如何协同工作以确保跨线程操作的正确性,并指导开发者编写高效且线程安全的代码。
|
8月前
|
设计模式 安全 Java
Java面试题:设计模式如单例模式、工厂模式、观察者模式等在多线程环境下线程安全问题,Java内存模型定义了线程如何与内存交互,包括原子性、可见性、有序性,并发框架提供了更高层次的并发任务处理能力
Java面试题:设计模式如单例模式、工厂模式、观察者模式等在多线程环境下线程安全问题,Java内存模型定义了线程如何与内存交互,包括原子性、可见性、有序性,并发框架提供了更高层次的并发任务处理能力
113 1
|
8月前
|
安全 Java 开发者
Java面试题:Java内存模型解析,Java内存模型的基本概念和它的重要性,Java内存模型中的“可见性”和“有序性”,以及具体实现?
Java面试题:Java内存模型解析,Java内存模型的基本概念和它的重要性,Java内存模型中的“可见性”和“有序性”,以及具体实现?
87 1
|
9月前
|
缓存 Java 程序员
Java内存模型深度解析:可见性、有序性和原子性
在多线程编程中,正确理解Java内存模型对于编写高效且无bug的并行程序至关重要。本文将深入探讨JMM的三大核心特性:可见性、有序性和原子性,并结合实例分析如何利用这些特性来避免常见的并发问题。
84 1
|
9月前
|
算法 Java
[Java·算法·中等] LeetCode21. 合并两个有序链表
[Java·算法·中等] LeetCode21. 合并两个有序链表
86 2
|
9月前
|
存储 Java
打破常规!HashSet和TreeSet教你重新认识Java集合的无序与有序
【6月更文挑战第17天】Java集合框架中的Set接口,HashSet无序而TreeSet有序。HashSet基于哈希表,元素插入顺序不可预测,适合快速去重。TreeSet利用红黑树保证有序性,支持自然排序或自定义排序。若需同时无序和有序,可先用HashSet去重,再将元素加入TreeSet,但会牺牲性能。选择时依据对顺序和性能的需求。
220 2
|
9月前
|
算法 安全 Java
【经典算法】LeetCode 21:合并两个有序链表Java/C/Python3实现含注释说明,Easy)
【经典算法】LeetCode 21:合并两个有序链表Java/C/Python3实现含注释说明,Easy)
54 1

热门文章

最新文章