各个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)) |