底层实现结构
jdk1.7版本:以数组加链表的形式组成
jdk1.8版本:新增了红黑树的组成结构
如图:
基本属性
// HashMap 初始化长度
static final int DEFAULT_INITIAL_CAPACITY = 1 << 4; // aka 16
// HashMap 最大长度
static final int MAXIMUM_CAPACITY = 1 << 30; // 1073741824
// 默认的加载因子 (扩容因子)
static final float DEFAULT_LOAD_FACTOR = 0.75f;
// 当链表长度大于此值且容量大于 64 时
static final int TREEIFY_THRESHOLD = 8;
// 转换链表的临界值,当元素小于此值时,会将红黑树结构转换成链表结构
static final int UNTREEIFY_THRESHOLD = 6;
// 最小树容量
static final int MIN_TREEIFY_CAPACITY = 64;
常见问题
1.什么是加载因子?加载因子为什么是 0.75?
加载因子:即扩容因子,负载因子;当HashMap的容量达到一定负载后,回进行扩容;比如,HashMap的初始长度是16,那么当HashMap中元素的数量达到16 * 0.75时,进行扩容。
加载因子过大,扩容的频率低,空间就小,Hash冲突高,运行效率低;
加载因子过小,会占用过分的空间。
2.什么时候链表转树,什么时候树转链表?
链表转树:链表长度大于等于8且数组的长度大于等于64
树转链表:链表长度小于等于6
3.什么时候调用resize方法进行扩容?
A.初始化table
B.HashMap的容量达到一定负载
C.某一个链表长度达到了8,但是数组的长度小于64
注意:java8中hashmap是先插入数据
Q.E.D.
Comments | 0 条评论