Java集合简单了解——基于JDK1.8中LinkedHashMap、TreeMap、Hashtable、Properties的实现原理

简介: Java集合简单了解——基于JDK1.8中LinkedHashMap、TreeMap、Hashtable、Properties的实现原理

文章目录:


1.LinkedHashMap

1.1 源码中的注释部分

2.TreeMap

3.Hashtable

4.Properties

 


1.LinkedHashMap


1.1 源码中的注释部分

* <p>Hash table and linked list implementation of the <tt>Map</tt> interface,

* with predictable iteration order.  This implementation differs from

* <tt>HashMap</tt> in that it maintains a doubly-linked list running through

* all of its entries.  This linked list defines the iteration ordering,

* which is normally the order in which keys were inserted into the map

* (<i>insertion-order</i>).  Note that insertion order is not affected

* if a key is <i>re-inserted</i> into the map.  (A key <tt>k</tt> is

* reinserted into a map <tt>m</tt> if <tt>m.put(k, v)</tt> is invoked when

* <tt>m.containsKey(k)</tt> would return <tt>true</tt> immediately prior to

* the invocation.)


从注释中,我们可以先了解到 LinkedHashMap 是通过哈希表和链表实现的,它通过维护一个链表来保证对哈希表迭代时的有序性,而这个有序是指键值对插入的顺序。另外,当向哈希表中重复插入某个键的时候,不会影响到原来的有序性。也就是说,假设你插入的键的顺序为 1234,后来再次插入 2,迭代时的顺序还是 1234,而不会因为后来插入的 2 变成 1342。(但其实我们可以改变它的规则,使它变成 1342


LinkedHashMap的实现主要分两部分,一部分是哈希表,另外一部分是链表。哈希表部分继承了 HashMap,拥有了 HashMap 那一套高效的操作,所以我们要看的就是 LinkedHashMap 中链表的部分,了解它是如何来维护有序性的。


LinkedHashMap的大致实现如下图所示,当然链表和哈希表中相同的键值对都是指向同一个对象,这里把它们分开来画只是为了呈现出比较清晰的结构。


下面我们来看一下关于LinkedHashMap的声明代码:

public class LinkedHashMap<K,V> extends HashMap<K,V> implements Map<K,V>

从上面的声明中,我们可以看见 LinkedHashMap 是继承自 HashMap 的,所以它已经从 HashMap 那里继承了与哈希表相关的操作了,那么在 LinkedHashMap 中,它可以专注于链表实现的那部分,所以与链表实现相关的属性如下。


//头指针
transient LinkedHashMap.Entry<K,V> head;
//尾指针
transient LinkedHashMap.Entry<K,V> tail;
//默认为 false。当为 true 时,表示链表中键值对的顺序与每个键的插入顺序一致,也就是说重复插入键的时候,也会更新键值对的顺序
//简单来说,为 false 时,就是上面所指的 1、2、3、4 的情况;为 true 时,就是 1、3、4、2 的情况
final boolean accessOrder;

·       LinkedHashMap HashMap 的子类。

·       HashMap存储结构的基础上,使用了一对双向链表来记录添加元素的顺序。

·       LinkedHashSet的底层实际上就是newLinkedHashMapLinkedHashMap 可以维护 Map 的迭代顺序:迭代顺序与 Key-Value 对的插入顺序一致。 

2.TreeMap


·       TreeMap存储 Key-Value 对时,需要根据 key-value 对进行排序。

·       TreeMap 可以保证所有的 Key-Value 对处于有序状态。

·       TreeSet底层使用红黑树结构存储数据。

·       TreeMap Key 的排序:

      自然排序:TreeMap 的所有的 Key 必须实现 Comparable 接口,而且所有的 Key 应该是同一个类的对象,否则将会抛出ClasssCastException
       
定制排序:创建 TreeMap 时,传入一个 Comparator 对象,该对象负责对TreeMap 中的所有 key 进行排序。此时不需要 Map Key 实现 Comparable 接口

·       TreeMap判断两个key 相等的标准:两个key通过compareTo()方法或者compare()方法返回0

3.Hashtable


·       Hashtable是个古老的 Map 实现类,JDK1.0就提供了。不同于HashMapHashtable是线程安全的。

·       Hashtable实现原理和HashMap相同,功能相同。底层都使用哈希表结构,查询速度快,很多情况下可以互用。

·       HashMap不同,Hashtable 不允许使用 null 作为 key value

·       HashMap一样,Hashtable 也不能保证其中 Key-Value 对的顺序

4.Properties


·       Properties 类是 Hashtable 的子类,该对象用于处理属性文件。

·       由于属性文件里的 keyvalue 都是字符串类型,所以 Properties 里的 key value 都是字符串类型。

·       存取数据时,建议使用setProperty(String key,String value) 方法和getProperty(String key) 方法。

相关文章
|
存储 安全 Java
Java 集合框架中的老炮与新秀:HashTable 和 HashMap 谁更胜一筹?
嗨,大家好,我是技术伙伴小米。今天通过讲故事的方式,详细介绍 Java 中 HashMap 和 HashTable 的区别。从版本、线程安全、null 值支持、性能及迭代器行为等方面对比,帮助你轻松应对面试中的经典问题。HashMap 更高效灵活,适合单线程或需手动处理线程安全的场景;HashTable 较古老,线程安全但性能不佳。现代项目推荐使用 ConcurrentHashMap。关注我的公众号“软件求生”,获取更多技术干货!
257 3
|
Java 数据处理 API
JDK 21中的序列集合:有序数据处理的新篇章
JDK 21引入了序列集合(Sequenced Collections),这是一种维护元素插入顺序的新型集合。本文介绍了序列集合的概念、特性及其应用场景,如事件日志记录、任务调度和数据处理。通过保持插入顺序和高效的遍历方法,序列集合为开发者提供了更直观和易用的API。
|
存储 缓存 安全
在Java的Map家族中,HashMap和TreeMap各具特色
【10月更文挑战第19天】在Java的Map家族中,HashMap和TreeMap各具特色。HashMap基于哈希表实现,提供O(1)时间复杂度的高效操作,适合性能要求高的场景;TreeMap基于红黑树,提供O(log n)时间复杂度的有序操作,适合需要排序和范围查询的场景。两者在不同需求下各有优势,选择时需根据具体应用场景权衡。
186 2
|
存储 Java API
详细解析HashMap、TreeMap、LinkedHashMap等实现类,帮助您更好地理解和应用Java Map。
【10月更文挑战第19天】深入剖析Java Map:不仅是高效存储键值对的数据结构,更是展现设计艺术的典范。本文从基本概念、设计艺术和使用技巧三个方面,详细解析HashMap、TreeMap、LinkedHashMap等实现类,帮助您更好地理解和应用Java Map。
303 3
|
存储 Java
Java中的HashMap和TreeMap,通过具体示例展示了它们在处理复杂数据结构问题时的应用。
【10月更文挑战第19天】本文详细介绍了Java中的HashMap和TreeMap,通过具体示例展示了它们在处理复杂数据结构问题时的应用。HashMap以其高效的插入、查找和删除操作著称,而TreeMap则擅长于保持元素的自然排序或自定义排序,两者各具优势,适用于不同的开发场景。
173 1
|
存储 安全 Java
Java Map新玩法:深入探讨HashMap和TreeMap的高级特性
【10月更文挑战第19天】Java Map新玩法:深入探讨HashMap和TreeMap的高级特性,包括初始容量与加载因子的优化、高效的遍历方法、线程安全性处理以及TreeMap的自然排序、自定义排序、范围查询等功能,助你提升代码性能与灵活性。
169 2
|
存储 安全 Java
Java Map新玩法:探索HashMap和TreeMap的高级特性,让你的代码更强大!
【10月更文挑战第17天】Java Map新玩法:探索HashMap和TreeMap的高级特性,让你的代码更强大!
293 2
|
存储 Java 开发者
Java Map实战:用HashMap和TreeMap轻松解决复杂数据结构问题!
【10月更文挑战第17天】本文深入探讨了Java中HashMap和TreeMap两种Map类型的特性和应用场景。HashMap基于哈希表实现,支持高效的数据操作且允许键值为null;TreeMap基于红黑树实现,支持自然排序或自定义排序,确保元素有序。文章通过具体示例展示了两者的实战应用,帮助开发者根据实际需求选择合适的数据结构,提高开发效率。
321 2