【深入Java基础】各个Map类的比较与总结

各个Map类的比较与总结


本文主要对
HashMap,
LinkedHashMap,
TeeeMap,
WeakHashMap,
IdentityHashMap
进行对比分析。


Map : 以key-value键值对的形式存储数据,通过key获取value。是一种无序的数据结构。


一、HashMap

HashMap是最常用的一种map。它有以下特点:

1.内部数据存储使用数组+链表实现(1.8之后为了解决大量hash冲突,引入了红黑树)

2.采用链地址法解决hash冲突。

3.键值对是无序排列的(除非hash值有序)。要想转化为有序排列可利用Collections.sort()实现。

4.key和value都允许为null。并且只允许一个key为null,但允许多个value为null。

5.不是同步的。要想变为同步需要手动加锁或者使用Collections.synchronizedMap()返回一个同步的map。

二、LinkedHashMap

LinkedHashMap是一种有序的HashMap,继承自HashMap,内部实现原理和HashMap极为相似。它有以下特点:

1.它是有序的map,即“插入有序”和“访问有序”。LinkedHashMap内部比HashMap多了一个双链表来维护这种顺序关系。所以它的性能要弱于HashMap。

2.它不是同步的。而Hashtable是同步的(它们的内部数据结构相似)

3.key和value都允许为null。并且只允许一个key为null,但允许多个value为null。

三、TreeMap

TreeMap是一种有序的Map。内部采用红黑树存储数据。它有一下特点:

1.内部采用红黑树实现。

2.可以重写compare()方法实现升序或者降序排列。

3.它不是同步的。

四、WeakHashMap

WeakHashMap即“弱HashMap”。它与HashMap的主要区别如下:

HashMap保留key所引用的对象,除非hashmap对象销毁否则key所引用的实际对象不会被回收。而WeakHashMap的key所引用的对象可能被回收,回收之后会自动删除entry键值对。

五、IdentityHashMap

IdentityHashMap即“一致的HashMap”,也就是当两个key严格相等,即为同一对象(key1==key2)时才认为是同一key。

六、比较

HashMap Hashtable LinkedHashMap TreeMap
数据结构 数组+链表 数组+链表 数组+链表+双向链表 红黑树
有序性 无序 无序 有序 有序
可否为null key和value都可为null key和value都不可为null key和value都可为null key和value都可为null
同步性 不同步 同步 不同步 同步
时间复杂度 插入O(1),查找O(1) 插入O(1),查找O(n²) 插入O(1),查找O(log(n)) 插入O(1),查找O(log(n))
原文地址:https://www.cnblogs.com/cnsec/p/13286726.html