1. HashMap
- 是一个散列图,存储的内容是键值对映射
- hashMap:(java 8 以前):数组+ 链表,结合了两者的优势。操作是非sychronized,效率比较高,默认长度为16,每个数组元素中存储的是链表的头节点。通过位运算获取要存放的位置。最坏情况O(1)-> O(n),运行插入null的值
- hashmap java8以后采用:数组+链表+红黑树,使用一个常量:TREEIFY_THRESHOLD来控制是否将链表转换为红黑树来存储他们。最坏情况:O(1) -> O(log(n))
2. HashTable
线程安全的,在方法中加了synchronized,由于在多线程环境下是串行执行的效率比较低。
3. ConcurrentHashMap
HashMap和synchronizedMap()化的hashMap,多线程竞争时都会竞争同一把锁,导致效率极其低下。java5后,ConcurrentHashMap应运而生。
- 如何优化hashTable?
1.1 初期的,通过锁的细粒度化,将整个锁拆解成多个锁进行优化。默认分16个分锁
1.2 当前的ConcurrentHashMap:CAS + synchronlized 使锁更加细化。synchronized只锁定当前的链表或者红黑树的首节点,hash不冲突就不会并发。不允许插入null的值 - 首先使用无锁操作CSA插入头节点,失败则循环重试。
- 若头节点已存在,则尝试获取头节点的同步锁,在进行操作
- ConcurrentHashMap:别的注意点:
4.1 size()方法和mappingCount()方法的异同,两者计算是否准确
4. 三者区别
| 区别 | |
|---|---|
| hashmap | 线程不安全。数组+链表+红黑树 , key、value均可为null |
| hashtable | 线程安全。数组 + 链表,锁住整个对象(hashtable), key、value均不可为null |
| ConcurrentHashMap | 线程安全,CSA+同步锁,数组+链表+红黑树 key、value均不可为null |
| list | set | |
|---|---|---|
| 特点 | 有序(存储和取出的顺序),可重复,可通过索引操作元素 ,可通过get()方法读取 | 无序(存储和取出的顺序),不可重复,不支持 |
| 分类1 | 1. :底层是数组,查询快,增删慢: 1. ArrayList–线程不安全,效率高 2. Vector – 线程安全,效率低 | 1. 底层是hash表 – HashSet – 保证元素的唯一性方式:1. hashCode() ;2. equals() |
| 分类2 | 2. 底层是链表,查询慢,增删快: – LinkedList – 线程不安全,效率高 | 2. 底层是二叉树, – TreeSet – 保证元素的排序的方式: 1. 自然排序,让对象所属的类去实现compareble接口,无参构造; 2. 比较器接口comparator,带参构造。 |
博客介绍了HashMap、HashTable和ConcurrentHashMap。HashMap操作非同步,效率高,Java 8前后结构有变化;HashTable线程安全但效率低;ConcurrentHashMap优化了多线程性能,采用CAS + synchronized使锁更细化。还提及了三者的区别及ConcurrentHashMap的一些注意点。
1万+

被折叠的 条评论
为什么被折叠?



