写点什么

ArrayList、HashMap 等集合初始容量的大小以及扩容的倍数

  • 2022 年 5 月 01 日
  • 本文字数:1314 字

    阅读完需:约 4 分钟

[](()首次使用




默认容量大小为 10


在插入元素之前,它会先检查是否需要扩容,然后再把元素添加到数组中最后一个元素的后面。在 ensureCapacityInternal 方法中,


我们可以看见,如果当 elementData 为空数组时,它会使用默认的大小去扩容。所以说,通过无参构造方法来创建 ArrayList 时,它的大小其实是为 0 的,只有在使用到的时候,才会通过 grow 方法去创建一个大小为 10 的数组。


private static final int DEFAULT_CAPACITY = 10;


[](()扩容




grow 方法是在数组进行扩容的时候用到的,从中我们可以看见,ArrayList 每次扩容都是扩 1.5 倍,然后调用 Arrays 类的 copyOf 方法,把元素重新拷贝到一个新的数组中去。


private void grow(int minCapacity) {


// overflow-conscious code


int oldCapacity = elementData.length;


//右移相当于除 2 在加上原来的部分就成为了 1.5 倍


int newCapacity = oldCapacity + (oldCapacity >> 1);


if (newCapacity - minCapacity < 0)


newCapacity = minCapacity;


if (newCapacity - MAX_ARRAY_SIZE > 0)


newCapacity = hugeCapacity(minCapacity);


// minCapacity is usually close to size, so this is a wi


n:


elementData = Arrays.copyOf(elementData, newCapacity);


}


[](()Vector


=====================================================================


Vector 比 ArrayList 多了一个属性:


这个属性是在扩容的时候用到的,它表示每次扩容只扩 capacityIncrement 个空间就足够了。该属性可以通过构造方法给它赋值。先来看一下构造方法:


protected int capacityIncrement;


[](()构造方法




// 初始化容器大小,和每次扩容大小


public Vector(int initialCapacity, int capacityIncrement)


{


super();


if (initialCapacity < 0)


throw new IllegalArgumentException("Illegal Capacit


y: "+initialCapacity);


this.elementData = new Object[initialCapacity];


this.capacityIncrement = capacityIncrement;


}


//初始化容器大小


pub 《一线大厂 Java 面试题解析+后端开发学习笔记+最新架构讲解视频+实战项目源码讲义》无偿开源 威信搜索公众号【编程进阶路】 lic Vector(int initialCapacity) {


this(initialCapacity, 0);


尚硅谷 Java 高级编程 宋红康


}


//无参构造初始化容量为 10


public Vector() {


this(10);


}


简单总结一下:这三种构造方法


  • 无参构造

  • 可以设置初始化容量

  • 也可初始化容量和每次扩充的大小


从构造方法中,我们可以看出 Vector 的默认大小也是 10,而且它在初始化的时候就


已经创建了数组了。


[](()扩容




private void grow(int minCapacity) {


// overflow-conscious code


int oldCapacity = elementData.length;


int newCapacity = oldCapacity + ((capacityIncrement >


  1. ? capacityIncrement : oldCapacity);


if (newCapacity - minCapacity < 0)


newCapacity = minCapacity;


if (newCapacity - MAX_ARRAY_SIZE > 0)


newCapacity = hugeCapacity(minCapacity);


elementData = Arrays.copyOf(elementData, newCapacity);


}


如果指定了扩容的大小( capacityIncrement),则按照指定的大小进行扩容。


如果没有指定扩容的大小,则每次扩容为之前的两倍。


[](()HashMap


======================================================================

用户头像

还未添加个人签名 2022.04.13 加入

还未添加个人简介

评论

发布
暂无评论
ArrayList、HashMap等集合初始容量的大小以及扩容的倍数_Java_爱好编程进阶_InfoQ写作社区