简介
本文介绍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。
请先
!