Java集合简单了解——基于JDK1.8中LinkedHashMapTreeMapHashtableProperties的实现原理

Posted 张起灵-小哥

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java集合简单了解——基于JDK1.8中LinkedHashMapTreeMapHashtableProperties的实现原理相关的知识,希望对你有一定的参考价值。

文章目录:

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 是通过哈希表和链表实现的,它通过维护一个链表来保证对哈希表迭代时的有序性,而这个有序是指键值对插入的顺序。另外,当向哈希表中重复插入某个键的时候,不会影响到原来的有序性。也就是说,假设你插入的键的顺序为 1、2、3、4,后来再次插入 2,迭代时的顺序还是 1、2、3、4,而不会因为后来插入的 2 变成 1、3、4、2。(但其实我们可以改变它的规则,使它变成 1、3、4、2)

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的底层实际上就是new了LinkedHashMap,LinkedHashMap 可以维护 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就提供了。不同于HashMap,Hashtable是线程安全的。
  • Hashtable实现原理和HashMap相同,功能相同。底层都使用哈希表结构,查询速度快,很多情况下可以互用。
  • 与HashMap不同,Hashtable 不允许使用 null 作为 key 和 value。
  • 与HashMap一样,Hashtable 也不能保证其中 Key-Value 对的顺序

4.Properties

  • Properties 类是 Hashtable 的子类,该对象用于处理属性文件。
  • 由于属性文件里的 key、value 都是字符串类型,所以 Properties 里的 key 和 value 都是字符串类型。
  • 存取数据时,建议使用 setProperty(String key,String value) 方法和 getProperty(String key) 方法。

以上是关于Java集合简单了解——基于JDK1.8中LinkedHashMapTreeMapHashtableProperties的实现原理的主要内容,如果未能解决你的问题,请参考以下文章

Java集合源码剖析——基于JDK1.8中ConcurrentHashMap的实现原理

Java集合源码剖析——基于JDK1.8中ConcurrentHashMap的实现原理

Java集合源码剖析——基于JDK1.8中ConcurrentHashMap的实现原理

Java集合基于JDK1.8的ArrayList源码分析

Java集合源码剖析——基于JDK1.8中HashMap的实现原理

java集合HashMap源码解析(基于JDK1.8)