各种Map的比较

HashMap LinkedHashMap ConcurrentHashMap SynchronizedMap ConcurrentLinkedHashMap 比较

HashMap 线程不安全,无序
HashMap implement Map
非线程安全: 同时修改key值,会覆盖; map扩容,值转移过程中,出现循环链表
为什么使用键值对, 数据查找效率高, 链表更新效率高,数据和链表结合就组合成了Map(键值对)

hashMap无序:put操作,是通过key值取哈希获取的,keyset进行遍历时,先遍历数组,后遍历链表

https://blog.csdn.net/java_yes/article/details/79800917

LinkedHashMap 线程不安全,有序 (HashMap 加了一个双向链表)
LinkedHashMap extends HashMap implements Map
数据结构:数组加链表, 额外有一个双向链表(桶中链表是散列的,双向链表是LinkedHashMap额外引入,桶中链表只做存储,没有顺序概念,LinkedHashMap的双向链表,将插入Map的数据,按插入顺序存储起来,所有有序)

https://blog.csdn.net/java_yes/article/details/79814378

ConcurrentHashMap 线程安全 (HashTable 全局锁,已废弃)(HashMap 加了分段锁-segment 或swap)
jdk1.7 分段锁-segment, jdk1.8 CAS(compare and swap)算法
CAS: 有3个操作数,内存值V,旧的预期值A,要修改的新值B。当且仅当预期值A和内存值V相同时,将内存值V修改为B,否则什么都不做

size()和containsValue()  按照顺序进行锁,否则容易引起死锁   https://www.jianshu.com/p/d0b37b927c48

尽管linkedHashMap是有序的,但是JDK自带的JSON序列化和fastJson默认设置的JSON,序列化默认是无序的,如果想要保证有序,需要进行特殊的设置,比如使用GSON

https://blog.csdn.net/java_yes/article/details/79842173
https://blog.csdn.net/zxw9202/article/details/79022010

SynchronizedHashMap 线程安全 (HashMap上加了全局锁,synchronized)
基本上都是调用Map方法,只不过在方法前加synchronized而已,以此来保证线程安全

https://blog.csdn.net/java_yes/article/details/79938185

ConcurrentLinkedHashMap  (在HashMap 上了 分段锁,和双向链表, 并实现了LRU)
谷歌提供,性能与ConcurrentHashMap稍弱,但是能够保证有序,并且可以自动实现LRU,比较适合使用localCache场景
https://blog.csdn.net/u011955252/article/details/80940373

 

 

HashMap的负载因子为什么默认是0.75

负载因子是0.75的时候,空间利用率比较高,而且避免了相当多的Hash冲突,使得底层的链表或者是红黑树的高度比较低,提升了空间效率。

 

-------

HashSet 继承了Set接口,不允许存储相同的元素,通过hashcode、equals来实现

存储散列表,无序,不是线程安全

 

HashMap:继承了Map接口,可以存储相同元素,散列表,无序,不是线程安全

 

HashTable:线程安全,无序,通过Synchronized来保证线程安全, 不允许null值

 

ArrayList: 继承了List接口,有序,线程不安全

 

LinkedList,继承了List接口,有序,线程不安全

posted on 2020-04-09 17:45  wangsong412  阅读(713)  评论(0编辑  收藏  举报