各种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接口,有序,线程不安全