HashMap集合非线程安全;
HashMap集合继承关系,实现的接口有:
public class HashMap extends AbstractMap
implements Map, Cloneable, Serializable { }
HashMap集合继承了Map集合,实现了Map,Cloneable,Serializable接口
从继承Map集合我们可以得出:
HashMap集合是无序不可重复的
存储方式为键值对的方式存储(key,value);
存入是某种顺序,去取出来不一定是这种顺序;
不可重复指的是map集合的key部分是不可重复的;
static final int DEFAULT_INITIAL_CAPACITY = 1 << 4; // aka 16
1<<4 ( 1按位左移四位是16 = 1*2^4)
默认初始化容量是16;每次扩容到原来的2倍
static final int MAXIMUM_CAPACITY = 1 << 30;
//最大容量为2^30
static final float DEFAULT_LOAD_FACTOR = 0.75f;
//默认加载因子是0.75;
默认加载因子:当底层数组长度大于75%时,数组开始扩容
下面是扩容的一部分源码:
final Node[] resize() {
Node[] oldTab = table;
int oldCap = (oldTab == null) ? 0 : oldTab.length;
int oldThr = threshold;
int newCap, newThr = 0;
if (oldCap > 0) {//原容量大于0时
if (oldCap >= MAXIMUM_CAPACITY) {//原容量大于最大容量时
threshold = Integer.MAX_VALUE;
return oldTab;
}//当原容量小于最大容量时
//newCap = oldCap << 1 新的容量是原来的2倍且小于最大容量
else if ((newCap = oldCap << 1) = DEFAULT_INITIAL_CAPACITY)//原来的容量要大于默认初始容量
newThr = oldThr << 1;
}
链表转换为红黑树的条件:
static final int TREEIFY_THRESHOLD = 8;
//链表长度>8时,链表转换为数组
static final int UNTREEIFY_THRESHOLD = 6;
//树的长度<6时,树转换为链表
这里解释一下:
自jdk1.8开始HashMap底层为数组+链表+红黑树这种数据结构
这种结构既发挥了数组查询效率高的优势,也发挥了链表随机增删效率高的优势
数组中的每个元素为链表或者红黑树
形如以下的亚子:
原创文章 9获赞 8访问量 365
关注
私信
展开阅读全文
作者:dxd_recordpath