Java中集合容量是有初始值的,如果容量不够用就会进行扩容,并将容器原来的数据全部复制到新的内存上。
设置合理的初始容量,可以提高效率。
加载因子(factor):小于等于1,当元素个数超过(容量长度*加载因子)时,进行扩容。
List 元素是有序的、可重复,ArrayList、Vector默认初始容量为10。
- Vector:线程安全,性能差,底层数据结构是数组
- 加载因子为1:即当元素个数超过容量长度时,才扩容
- 扩容增量:增大为原容量的2倍。如Vector的容量为10,一次扩容后是容量为20
- ArrayList:线程不安全,查询速度快,底层数据结构是数组结构,与Vector的区别是扩容增量时增加50%的容量。如 ArrayList的容量为10,一次扩容后是容量为16
Set的子类大部分是无序的、不可重复(TreeSet是有序的)。
- HashSet:线程不安全,存取速度快,内部实现是HashMap的key entry
- 默认初始容量为16(为何是16,见下方对HashMap的描述)
- 加载因子为0.75:即当 元素个数 超过 容量长度的0.75倍 时,进行扩容
- 扩容增量:增加1倍,HashSet的容量为16,一次扩容后是容量为32
Map
- HashMap:默认初始容量为16,长度始终保持2的n次方(16是2^4,可以提高查询效率,另外,32=16<<1,扩容只需左移,速度很快)
- 加载因子为0.75:即当 元素个数 超过 容量长度的0.75倍 时,进行扩容
- 扩容增量:增加1倍,如HashMap的容量为16,一次扩容后是容量为32
- HashTable:从Java1.2开始就被废弃,现在也就面试有点用。默认初始容量为11,线程安全,但是速度慢,不允许key/value为null
- 加载因子为0.75:即当 元素个数 超过 容量长度的0.75倍 时,进行扩容
- 扩容增量:2*原数组长度+1,如 HashTable的容量为11,一次扩容后是容量为23