一、构造方法
构造方法有4个。
1、手动声明初始容量及负载因子的构造函数。初容容量的最大值不能超过MAXIMUM_CAPACITY
2、手动声明初始容量的构造函数,负载因子是默认大小。
默认的负载因子是0.75
3、无参的构造函数,会指定默认的负载因子。容量是默认的
static final int DEFAULT_INITIAL_CAPACITY = 1 << 4;
4、参数是map类型的有参构造函数 ,负载因子是默认大小。
二、存值过程
1、首先会对传入的key进行hash计算
2、没有指定长度:
①、执行resize()方法进行初始化。将长度设置为默认的16,阀值设为12。
然后实例化一个Node类型的数组tab。长度是resize()方法返回的结果。
长度:newCap = DEFAULT_INITIAL_CAPACITY; 阀值:newThr = (int)(DEFAULT_LOAD_FACTOR * DEFAULT_INITIAL_CAPACITY);
同时要记录容器中元素的数量,如超过阀值则执行resize()方法进行扩容。扩容后的容器大小是扩容前的2倍。
②、用容器的长度和上述第一步中的hash值进行按位与计算。并使用该结果作为索引从tab数组中取数据。如为空,则直接存入到该索引位置;
如不为空,则判断hash跟key是否都一样,如一样就替换。
如不同,则判断是否是TreeNode类型:
a.是就调用putTreeVal()加入到红黑树中;
b.不是。作为一个链表加入相应的索引位置。如果链表的长度不小于7,则将链表转为红黑树。
以上只是我本人的观点,如有错误,请指出。