HashMap、hashTable、ConcurrentHashMap的区别

博客介绍了HashMap、HashTable和ConcurrentHashMap。HashMap操作非同步,效率高,Java 8前后结构有变化;HashTable线程安全但效率低;ConcurrentHashMap优化了多线程性能,采用CAS + synchronized使锁更细化。还提及了三者的区别及ConcurrentHashMap的一些注意点。

1. HashMap
  1. 是一个散列图,存储的内容是键值对映射
  2. hashMap:(java 8 以前):数组+ 链表,结合了两者的优势。操作是非sychronized,效率比较高,默认长度为16,每个数组元素中存储的是链表的头节点。通过位运算获取要存放的位置。最坏情况O(1)-> O(n),运行插入null的值
  3. hashmap java8以后采用:数组+链表+红黑树,使用一个常量:TREEIFY_THRESHOLD来控制是否将链表转换为红黑树来存储他们。最坏情况:O(1) -> O(log(n))
2. HashTable

线程安全的,在方法中加了synchronized,由于在多线程环境下是串行执行的效率比较低。

3. ConcurrentHashMap

HashMap和synchronizedMap()化的hashMap,多线程竞争时都会竞争同一把锁,导致效率极其低下。java5后,ConcurrentHashMap应运而生。

  1. 如何优化hashTable?
    1.1 初期的,通过锁的细粒度化,将整个锁拆解成多个锁进行优化。默认分16个分锁
    1.2 当前的ConcurrentHashMap:CAS + synchronlized 使锁更加细化。synchronized只锁定当前的链表或者红黑树的首节点,hash不冲突就不会并发。不允许插入null的值
  2. 首先使用无锁操作CSA插入头节点,失败则循环重试。
  3. 若头节点已存在,则尝试获取头节点的同步锁,在进行操作
  4. ConcurrentHashMap:别的注意点:
    4.1 size()方法和mappingCount()方法的异同,两者计算是否准确
4. 三者区别
区别
hashmap线程不安全。数组+链表+红黑树 , key、value均可为null
hashtable线程安全。数组 + 链表,锁住整个对象(hashtable), key、value均不可为null
ConcurrentHashMap线程安全,CSA+同步锁,数组+链表+红黑树 key、value均不可为null
listset
特点有序(存储和取出的顺序),可重复,可通过索引操作元素 ,可通过get()方法读取无序(存储和取出的顺序),不可重复,不支持
分类11. :底层是数组,查询快,增删慢: 1. ArrayList–线程不安全,效率高 2. Vector – 线程安全,效率低1. 底层是hash表 – HashSet – 保证元素的唯一性方式:1. hashCode() ;2. equals()
分类22. 底层是链表,查询慢,增删快: – LinkedList – 线程不安全,效率高2. 底层是二叉树, – TreeSet – 保证元素的排序的方式: 1. 自然排序,让对象所属的类去实现compareble接口,无参构造; 2. 比较器接口comparator,带参构造。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值