有关ArrayList的扩容机制

import java.util.ArrayList;
import java.util.List;

/**
 * 由于ArrayList的底层数据结构是Object数组,所以我们用无参构造方法创建ArrayList时,
 * 它初始化赋值的是一个空数组,当我们对其进行添加第一个元素时,数组的容量会扩容为10,
 * 当我们添加的元素个数>10时,我们就需要进行扩容,扩容后的ArrayList容量则会变为原本容量的1.5倍左右
 */
public class ArrayListSource {
    public static void main(String[] args) {
        //第一种方法
        //创建一个ArrayList数组
        List<Integer> list = new ArrayList<>();

        //进行扩容操作演示
        for (int i = 1; i <= 20; i++) {
            if (i==1){
                System.out.println("还未添加元素,容量为0");
            }
            list.add(i);
            if (i==1){
                System.out.println("第一次添加元素,初始容量为10");
            }
            if (i==11){
                System.out.println("第一次进行扩容,容量为10*1.5=15");
            }
            if (i == 16) {
                System.out.println("第二次进行扩容,容量为15*1.5=22.5 -> 22");
            }
        }

        //第二种方法,手动设置一个初始容量
        List<Integer> list1 = new ArrayList<>(4);

        for (int i = 1; i <= 20; i++) {
            if (i==1){
                System.out.println("还未添加元素,容量为0");
            }
            list1.add(i);
            if (i==1){
                System.out.println("第一次添加元素,初始容量为4");
            }
            if (i==5){
                System.out.println("第一次进行扩容,容量为4*1.5=6");
            }
            if (i == 7) {
                System.out.println("第二次进行扩容,容量为6*1.5=9");
            }
        }
    }
}

首先对其进行断点(DeBug)

 

到达第一个断点时(此时容量为0),DeBug结果为

 到达第二个断点时(此时容量为10,默认初始容量),DeBug结果为

 到达第三个断点时(此时容量为15),DeBug结果为

到达第三个断点时(此时容量为22),DeBug结果为

 

 总结:

在JDK1.8中,如果通过无参构造的话,初始数组容量为0,当真正对数组进行添加时(即添加第一个元素时),才真正分配容量,默认分配容量为10;当容量不足时(容量为size,添加第size+1个元素时),先判断按照1.5倍(位运算)的比例扩容能否满足最低容量要求,若能,则以1.5倍扩容,否则以最低容量要求进行扩容。执行add(E e)方法时,先判断ArrayList当前容量是否满足size+1的容量;在判断是否满足size+1的容量时,先判断ArrayList是否为空,若为空,则先初始化ArrayList初始容量为10,再判断初始容量是否满足最低容量要求;若不为空,则直接判断当前容量是否满足最低容量要求;若满足最低容量要求,则直接添加;若不满足,则先扩容,再添加

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值