ArrayList、Vector、HashMap、HashTable如何扩容

在复习Java基础容器扩容相关时,发现许多博客写的十分混乱,整理一下源码和结论

ArrayList

默认初始10个大小,每次扩容是原容量的1.5倍,具体代码如下

public ArrayList() {
    this(10);
} 
int newCapacity = (oldCapacity * 3)/2 + 1;

public static native void arraycopy(Object src,  int  srcPos,
                                        Object dest, int destPos,
                                        int length);

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

Vector

默认初始10个大小,若容量增量系数(capacityIncrement) > 0,则将容器大小增加到capacityIncrement,否则将容量增加一倍,具体代码如下:

public Vector() {
    this(10);
} 
int newCapacity = (capacityIncrement > 0) ? 
    (oldCapacity + capacityIncrement) : (oldCapacity * 2);

如 Vector 的容量为10,一次扩容后是容量为20

HashMap

默认初始16个大小(必须是2的次方),当hashmap中的元素个数超过数组大小loadFactor时,就会进行数组扩容,loadFactor的默认值为0.75,也就是说,默认情况下,数组大小为16,那么当hashmap中元素个数超过16 * 0.75=12的时候,就把数组的大小扩展为2*16=32,即扩大一倍,然后重新计算每个元素在数组中的位置,具体代码如下:

static final int DEFAULT_INITIAL_CAPACITY = 16; 
static final float DEFAULT_LOAD_FACTOR = 0.75f;
public HashMap() {
    this.loadFactor = DEFAULT_LOAD_FACTOR;
    threshold = (int)(DEFAULT_INITIAL_CAPACITY * DEFAULT_LOAD_FACTOR);
    table = new Entry[DEFAULT_INITIAL_CAPACITY];
    init();
}

resize(2 * table.length);

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

HashTable

默认初始11个大小,当元素个数超过容量长度的0.75倍时进行扩容,扩容增量为2*原数组长度+1,具体代码如下:

public Hashtable() {
    this(11, 0.75f);
}
int newCapacity = oldCapacity * 2 + 1;

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

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容