文章目录:
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) 方法。


