HashMap学习(一)

HashMap(JDK1.8):数组+链表+红黑树
1.数组的默认大小:
static final DEFAULT_INITIAL_CATAGORY(容量) = 1 << 4;
2.加载因子:
static final DEFAULT_LOAD_FACTOR = 0.75f;
4.什么时候扩容:
  1.一旦容量超过这个阈值,就对数组进行扩容处理。扩容后的阈值是以前阈值*2
  2.当链表中的元素个数超过规定的值(static final int TREEIFY_THRESHOLD = 8),当数组大小未超过64时,对数组扩容。如果超过64就将链表转换为红黑树(链表中元素超过8个且数组大小超过64个)。
JDK1.6中判断扩容:
  当前容量是否超过阈值(容量 * 加载因子),扩容后的容量是之前容量的2倍
JDK1.7判断扩容:

  当前容量是否超过阈值(第一次直接用最大容量作为阈值,以后就如JDK1.6(根据resize方法));保证当前要插入的桶(就是数组中的元素)不能为空

5.HashMap线程不安全的原因:
   因为HashMap有自动扩容功能。
假如:线程1为写线程,线程2为读线程;而线程1向HashMap中写入数据后,需要对HashMap扩容。此时线程2可能读取的是旧的索引,而不是扩容后的桶的索引。索引HashMap是线程不安全的。

6.Collections.synchronizedMap(HashMap);用此方法可以使HashMap线程安全。

7.具体参考这篇文章:

HashMap源码分析

HashMap原理探究

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值