简介
本文介绍Java的HashMap的一些对比:JDK8与JDK7中HashMap的区别,HashMap、TreeMap和LinkedHashMap的区别。
JDK7与JDK8的HashMap区别
<col>
项
JDK7
JDK8
数据结构
数组+链表。
复杂度:O(n)
数组+链表+红黑树
链表节点数大于8时,链表转为红黑树,复杂度降至O(logn)
插入位置
插入链表头部
插入链表尾部
hash算法
复杂
简单。
红黑树效率高,提高查询效率的地方由红黑树实现,没必要像jdk7那么复杂。
扩容机制
多线程可能导致:数据覆盖、读出为null、死循环
多线程可能导致:数据覆盖、读出为null。不会导致死循环(因为用了尾插)
Map区别
相同点
HashMap/TreeMap/LinkedHashMap
类型
都属于Map;Map 主要用于存储键(key)值(value)对,根据键得到值,因此键不允许键重复,但允许值重复。
线程安全性
都是线程不安全的
不同点
HashMap
TreeMap
LinkedHashMap
null
只允许一条记录的key值为Null(多条会覆盖);
允许多条记录的Value为 Null。
不允许key的值为null
key和value均允许为null
(put和get操作,基本上可以达到常数时间的性能)
红黑树。
(get或put操作的时间复杂度是O(log(n)))
HashMap+双向链表
此类是HashMap的子类。
按key排序
不支持。
按照hashCode进行输出。
支持排序。
默认按key升序排序。可用Comparator自定义排序。
用Iterator 遍历TreeMap时,结果是排过序的。
按插入顺序存放
不支持
支持。
遍历时,按插入的顺序出结果。