HashMap
无论在构造函数是否指定数组长度,进行的都是延迟初始化
构造函数作用:
阈值:threshold,每次<<1 ,数组长度 × 负载因子
无参构造:设置默认的负载因子
有参:可以指定初始容量或者负载因子
HashMap中是延迟初始化的(也就是在准备添加第一个元素时,设置数组的长度,因此在指定长度时,会给threshold进行设置)
红黑树转换逻辑
链表在每次添加元素后,会进行判断是否需要树化
注意:链表中的头节点是不包含数组的,当链表长度为8时【也就是说链表中已经成功添加了8个元素】,判断是否进行树化
树化前先先进行判断数组长度是否小于64,如小于先进行数组扩容
最后,判读是否超过阈值,超过的话触发扩容。
ArrayList
当序列化时调用ObjectOutputStream.write方法时,会判断类是否重写了readObject和writeObject,若类重写了该方法,就调用对应的读和写的方法。
指定容量时,进行的是预初始化,不是延迟
添加元素时,先判断所需的最小容量是否足够,够的话就进行添加
判断是否足够,在10和所需的最小容量中取最大值作为(所需的最小容量,当减去数组长度 > 0时进行扩容。