| HashTable | HashMap | TreeMap |
安全性 | 安全 | 不安全(要保证线程安全的话就使用ConcurrentHashMap) | 不安全 |
对Null key 和Null value的支持 | 在HashTable 中 put 进的键值只要有一个 null,直接抛NullPointerException | HashMap 中,null 可以作为键,这样的键只有一个,可以有一个或多个键所对应的值为 null | |
效率 | | HashMap 要比 HashTable 效率高一点 | |
初始化容量 | 11 | 16 | |
扩容机制 | 容量变为原来的2n+1 | 原容量的 2 倍 | |
加载因子 | 0.75 | 0.75 | |
迭代方式 | Enumeration | Iterator | |
顺序问题 | | 在 Java1.4 中引入了 LinkedHashMap HashMap 的一个子类,假如你想要遍历顺序,你很容易从 HashMap 转向 LinkedHashMap,但是 HashTable 不是这样的,它的顺序是不可预知的 | |
功能上 | | 在Map中插入、删除和定位元素这类操作,HashMap是好的选择 | TreeMap能够把它保存的记录根据键排序,默认是按升序排序。 |
继承关系 | | 继承自AbstractMap | 不仅继承自AbstractMap,TreeMap它还实现了NavigableMap接口和SortedMap 接口 |
底层数据结构 | 数组+链表 | 数组+链表/数组+链表+红黑树 jdk1.8在解决哈希冲突时有了较大的变化,当链表长度大于阈值(默认为8)时,将链表转化为红黑树,以减少搜索时间 | 红黑树 |
推荐使用 | 在 Hashtable 的类注释可以看到,Hashtable 是保留类不建议使用,推荐在单线程环境下使用 HashMap 替代,如果需要多线程使用则用 ConcurrentHashMap 替代。 | 在 Hashtable 的类注释可以看到,Hashtable 是保留类不建议使用,推荐在单线程环境下使用 HashMap 替代,如果需要多线程使用则用 ConcurrentHashMap 替代。 | |
是否有fail fast | HashTable 提供对 key 的 Enumeration 进行遍历,它不支持 fail fast。 | HashMap 提供对 key 的 Set 进行遍历,因此它是 fail fast 的 | |