HashMap

HashMap

1.HashCode
2.HashMap 默认长度 16
为2的n次幂效率最高 减少碰撞
因为2的n次幂-1长度 的2进制值全都为1 (15 : 1111)
只要数据本身的hashcode值是均匀分布的 在hashmap里就是均匀的
为了在数组中均匀分布 想到的是模运算,但是模运算相对消耗较高,采用按 位& 在长度为2的n次幂时 - 1 ,2进制全为1
3.HashMap 默认的负载因子0.75
在元素个数 大于 数组长度 * 扩容因子的时候触发扩容
申请一个新数组 长度是原长度的两倍
java 1.7 采用的是头插法
扩容时是直接计算hash值 & length - 1
java 1.8 采用的是尾插法 采用红黑树优化链表 默认在链表元素大于8的时候 转化成树 在小于6的时候转化为链表
扩容时是看新参与运算那位bit是1还是0 是0就在原位置 是1 就原位置 加上旧长度 采用的是hash & 旧长度的方式 因为旧长度一定是2的n次幂
旧长度对应的2进制数 为1的那位 正是hash值新参与运算的那位 直接& 就能得出是1 还是 0
4.HashMap 是线程不安全的
线程安全可以使用ConcurrentHashMap 采用的分段锁的方式
java 1.7把数据分成一段一段的分段上锁,保证一个线程操作时不影响其 他线程操作其他数据 Segment锁
java 1.8 采用的是 CAS + synchronized 保证安全
CAS : compare and swap 比较并交换 用于保证并发时的无锁并 发的安全性
HashTable 是使用synchronized锁 共用一把锁, 一个线程操作 其他线程无 法操作
HashTable 和 同步器包装的HashMap 同一时间点,只能有一个线程持有锁
效率低下 但是能保证数据更新
ConcurrentHashMap 效率高 但不一定能保证数据最新 一个线程插入大量数 据 另一个线程读取 只能读到已经成功插入的数据

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值