简介
本文介绍Java的HashMap、TreeMap、LinkedHashMap之间的区别。
相同点
- 都属于Map;
- Map 主要用于存储键(key)值(value)对,根据键得到值,因此键不允许键重复,但允许值重复。
 
 - 都是线程不安全的
 
不同点
| 项 | HashMap | TreeMap | LinkedHashMap | 
| 按插入顺序存放 | 不支持 | 不支持。 | 支持。 遍历时,按插入的顺序出结果。 | 
| 按key排序 | 不支持。 按照hashCode进行输出。 | 支持。 默认按key升序排序。可用Comparator自定义排序。 用Iterator 遍历TreeMap时,结果是排过序的。 | 不支持。 | 
| 数据结构 | 数组 + 链表 + 红黑树 (put和get操作,基本可以达到常数时间的性能) | 红黑树。 (get或put操作的时间复杂度是O(log(n))) | HashMap + 双向链表 此类是HashMap的子类。 | 
| null | key和value均允许为null。 只允许一条记录的key值为null(多条会覆盖); 允许多条记录的Value为 null。 | 不允许key为null。 原因:TreeMap排序要对键进行比较。null不能参与任何比较,因为调用null的任何方法都会抛出NullPointerException。  | key和value均允许为null。 只允许一条记录的key值为null(多条会覆盖); 允许多条记录的Value为 null。 | 
- HashMap 、LinkedHashMap 的 key 和 value 都允许为 null。
 - ConcurrentHashMap、ConcurrentSkipListMap、Hashtable 的 key 和 value 都不允许为 null。
 

请先 !