java集合元素的默认大小

当底层实现涉及到扩容时,容器或从新分配一段更大的连续内存(若是是离散分配则不须要从新分配,离散分配都是插入新元素时动态分配内存),要将容器原来的数据所有复制到新的内存上,这无疑使效率大大下降。数组

加载因子的系数小于等于1,意指  即当 元素个数 超过 容量长度*加载因子的系数 时,进行扩容。安全

另外,扩容也是有默认的倍数的,不一样的容器扩容状况不一样。数据结构

List 元素是有序的、可重复线程

ArrayList、Vector默认初始容量为10接口

Vector:线程安全,但速度慢内存

    底层数据结构是数组结构效率

    加载因子为1:即当 元素个数 超过 容量长度 时,进行扩容容器

    扩容增量:原容量的 1倍List

      如 Vector的容量为10,一次扩容后是容量为20线程安全

ArrayList:线程不安全,查询速度快

    底层数据结构是数组结构

    扩容增量:原容量的 0.5倍+1

      如 ArrayList的容量为10,一次扩容后是容量为16

 

Set(集) 元素无序的、不可重复。

HashSet:线程不安全,存取速度快

     底层实现是一个HashMap(保存数据),实现Set接口

     默认初始容量为16(为什么是16,见下方对HashMap的描述)

     加载因子为0.75:即当 元素个数 超过 容量长度的0.75倍 时,进行扩容

     扩容增量:原容量的 1 倍

      如 HashSet的容量为16,一次扩容后是容量为32

 

Map是一个双列集合

HashMap:默认初始容量为16,长度始终保持2的n次方

     (为什么是16:16是2^4,能够提升查询效率,另外,32=16<<1       -->至于详细的缘由可另行分析,或分析源代码)

     加载因子为0.75:即当 元素个数 超过 容量长度的0.75倍 时,进行扩容

     扩容增量:原容量的 1 倍

      如 HashMap的容量为16,一次扩容后是容量为32

 

HashTable:默认初始容量为11

      线程安全,可是速度慢,不容许key/value为null

     加载因子为0.75:即当 元素个数 超过 容量长度的0.75倍 时,进行扩容

     扩容增量:2*原数组长度+1

      如 HashTable的容量为11,一次扩容后是容量为23

相关文章
相关标签/搜索