ArrayList 扩容机制

初始容量:

  • ArrayList() 会使用长度为零的数组

  • ArrayList(int initialCapacity) 会使用指定容量的数组

  • public ArrayList(Collection<? extends E> c) 会使用 c 的大小作为数组容量

1、ArrayList() 无参构造时,给的时一个空白的数组 DEFAULTCAPACITY_EMPTY_ELEMENTDATA,所以ArrayList初始容量为0:

 

2、ArrayList(int initialCapacity)时,参数为 initialCapacity,所以数组的容量为指定的容量:

 

3、ArrayList(Collection<? extends E> c)时,会使用集合c的大小作为数组的容量:

 

扩容的方式:

  1. add(Object o) 首次扩容为 10,再次扩容为上次容量的 1.5 倍

  2. addAll(Collection c) 没有元素时,扩容为 Math.max(10, 实际元素个数),有元素时为 Math.max(原容量 1.5 倍【即扩容后的容量大小】, 实际元素个数)

1、add(Object o) 首次扩容为 10,再次扩容为上次容量的 1.5 倍
  • 首次扩容会从0扩容成10,然后把添加到容量为0的数组中,然后长度为10的数组的替换长度为0的数组,然后丢弃数组为0的数组

第二次扩容会扩容到上一次容量的1.5倍,1.5倍指的是:先求扩容前容量的一半,然后再加入扩容前的容量===> 10>>1=5 ; 5+10=15

 

首次扩容会从0扩容成10,再次扩容会扩容到上一次容量的1.5倍,比如0,10,15,22,33…….

2、addAll(Collection c) 没有元素时,扩容为 Math.max(10, 实际元素个数),有元素时为 Math.max(原容量 1.5 倍【即扩容后的容量大小】, 实际元素个数)

比如:list初始容量为0,然后调用addAll()进行扩容,首次扩容为容量是10,然后我们add 容量为11的数组,然后就会比较:Math.max(原容量 1.5 倍【即扩容后的容量大小】, 实际元素个数)==>Math.max(10,11)===>11

比如:数组list已经有10个元素了,然后再add(1,2,3) 3个元素,会调用addAll()进行扩容,然后就会比较:Math.max(原容量 1.5 倍【即扩容后的容量大小】, 实际元素个数)==>Math.max(15,13)===>15

posted @ 2023-05-14 14:15  小謝同學  阅读(41)  评论(0编辑  收藏  举报