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判断扩容:
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.具体参考这篇文章: