Hashmap 和ConcurrentHashMap

本文深入探讨了HashMap和ConcurrentHashMap的区别与实现原理。HashMap是非线程安全的,采用数组+链表或红黑树结构,负载因子默认为0.75,当达到该比例时会进行扩容。而ConcurrentHashMap则是线程安全的,通过锁分段技术提升并发性能,避免一次性锁定整个表。相比于Hashtable,ConcurrentHashMap在效率上有显著优势,特别是在高并发场景下。
摘要由CSDN通过智能技术生成

1、Hashmap

  • 线程不安全
  • 实现方式:数组+链表或红黑树
  • 初始容量 16,当达到loadFactor(默认为0.75)后进行扩容,每次扩容容量 oldsize*2+1
  • index值计算 在Object中的hashcode基础上再运算 index = hash & (tab.length – 1)
  • 哈希冲突:hashcode根据key计算得到int值,如果两个或多个值落在同一个位置上时则会产生冲突,再使用所有的Key值使用equals进行比较;同一个位子上的元素将以链表的形式存放,新加入的放在链头,最先加入的放在链尾;
  • 当你的key为null时,会调用putForNullKey,HashMap允许key为null,这样的对像是放在table[0]中。
  • 加载因子:为了降低哈希冲突的概率,默认当HashMap中的键值对达到数组大小的75%时,即会触发扩容。因此,如果预估容量是100,即需要设定100/0.75=134的数组大小。(如果希望加快Key查找的时间,还可以进一步降低加载因子,加大初始大小,以降低哈希冲突的概率。)
  • 判断是否有key存在 map.containsKey(“key”); 使用get方法时,不管是key不存在或者value为空的情况下都会返回null;
/**
 * The default initial capacity - MUST be a power of two.
 */
static final int DEFAULT_INITIAL_CAPACITY = 1 << 4; // aka 16
/**
 * The load factor used when none specified in constructor.
 */
static final float DEFAULT_LOAD_FACTOR = 0.75f;

2、ConcurrentHashMap(HashTable )

2.1 hashtable

  • 线程安全,其中大致实现原理与hashmap一致,只是在针对整张hash表的synchronized
  • 不允许空的key或者value出现

2.2 ConcurrentHashMap

  • 线程安全,不同于hashtable的一次将整张Hash表锁住的方式,默认效率提升了16倍,在其中多了Segment的概念(读操作不加锁,由于HashEntry的value变量是 volatile的,也能保证读取到最新的值。)
  • ConcurrentHashMap采用锁分段技术,将整个Hash桶进行了分段segment,也就是将这个大的数组分成了几个小的片段segment,而且每个小的片段segment上面都有锁存在,那么在插入元素的时候就需要先找到应该插入到哪一个片段segment,然后再在这个片段上面进行插入,而且这里还需要获取segment锁。
  • ConcurrentHashMap让锁的粒度更精细一些,并发性能更好。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值