集合
List
- ArrayList
add()方法可以添加null,而且可以添加多个null
ArrayList底层结构和源码
-
ArrayList中维护了一个Object类型的数组elementData。
// transient瞬间的,短暂的 使用transient修饰表示该属性不会被序列化 transient Object[] elementData;
-
当创建ArrayList对象时,如果使用的是无参构造方法,则初始elementData容量为0,第一次添加数据,则扩容elementData为10,若需再次扩容,则扩容elementData为1.5倍。
-
如果使用的是指定大小的构造方法,则初始elementData容量为指定大小,若需要扩容,则直接雒容elementData为1.5倍
-
vector默认10,每次扩容2倍
Set
HashSet
Set集合特性与数学中集合特性一致也满足:确定性、互异性、无序性。
因此add()方法只能添加一个null。
HashSet底层是由HashMap实现的,数据存放在map的key中,value则存放的是一个常量PRESENT(= new Object());
第一次添加数据时,table(数组)初始化容量为16,临界值threshold为 16 * 加载因子loadFactor 0.75 = 12
table数组使用到了临界值,就会扩容为原来的一倍
在Java8中,如果一条链表的元素个数达到TREEIFY_THRESHOLD(默认为8),并且table大小 >= MIN_TREEIFY_CAPACITY(64)时会转化为红黑树,但如果链表 > 8而 数组table < 64,则table会继续扩容,不会转为红黑树。