TreeMap
- 底层实现是
红黑树
- Put方法的实现:
(a) 如果TreeMap是空的,直接插入为根节点
(b) 否则就要确定插入位置。如果指定了Comparetor
,那么直接使用Comparetor来决定插入位置,如果没指定比较器,则会认为Key实现了Comparable接口,直接调用Key的CompareTo
方法,如果Key没有实现Comparable,那么会抛出ClassCastException
异常。
(c) 插入完成后,修复红黑树。
LinkedHashMap
- Java8之前,使用
环形链表
维护每个键值对的引用,记录键值对的插入顺序,Java8使用双向链表
。
Hashtable
- 与HashMap作用相同,主要有两点区别:HashMap是
线程不安全
的,Hashtable是线程安全
的;Hashtable不能存放null
作为key,HashMap会把null key 存放在下标为0的位置。 - Hashtable基本已经被
弃用
,因为和Vector、Stack类似,采用了大量synchronized方式实现多线程安全,在大并发量的情况下效率比较低下,Java专门引入了在大并发量情况下使用的并发容器,这种容器由于在实现的时候采用了更加细粒度
的锁,因此在大并发量下有着更好的性能表现。
WeakHashMap
- 特点:存入其中的键值对,如果key没有外部的
强引用
,那么在垃圾回收的时候,该键值对会被移除掉。 - 实现方式:WeakHashMap维护了一个
ReferenceQueue
,当某个弱引用被GC回收时,这个弱引用会被添加到ReferenceQueue中,清除无强引用键值对的方法是expungStaleEntries
,该方法遍历ReferenceQueue中的每一个key,然后删除。