java底层 hashmap扩容怎么实现 hashtable和currenthashmap的原理

本文详细介绍了Java中HashMap的扩容机制,当哈希表达到75%负载因子时会进行扩容,从原来的大小翻倍。接着讨论了Hashtable和ConcurrentHashMap的区别。Hashtable使用全局锁确保线程安全,导致并发性能低下,而ConcurrentHashMap通过锁分段技术提高了并发性能,其默认将Map分为16个段,每个段独立加锁,允许更多线程并发操作。
摘要由CSDN通过智能技术生成

1.java底层 hashmap扩容怎么实现:

当哈希表接近装满时,因为数组的扩容问题,性能较低(转移到更大的哈希表中).

Java默认的散列单元大小全部都是2的幂,初始值为16(2的4次幂)。假如16条链表中的75%链接有数据的时候,则认为加载因子达到默认的0.75。HahSet开始重新散列,也就是将原来的散列结构全部抛弃,重新开辟一个散列单元大小为32(2的5次幂)的散列结果,并重新计算各个数据的存储位置。以此类推下去.....

负载(加载)因子:0.75.-->hash表提供的空间是16 也就是说当到达12的时候就扩容

2.hashtable和currenthashmap的原理:

HashTable容器使用synchronized来保证线程安全,但在线程竞争激烈的情况下,HashTable的效率非常低下。因为当一个线程访问HashTable的同步方法时,其他线程访问HashTable的同步方法时,可能会进入阻塞或轮询状态。如线程1使用put进行添加元素,线程2不但不能使用put方法添加元素,并且也不能使用get方法来获取元素,所以竞争越激烈效率越低。

3.hashtable实现:

底层数组+链表实现,无论key还是value都**不能为null**,线程**安全**,实现线程安全的方式是在修改数据时锁住整个HashTable,效率低,ConcurrentHashMap做了相关优化

初始size为**11**,扩容:newsize = olesize*2+1

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值