ArrayList扩容机制

ArrayList无参初始化默认容量是0,往list里面添加一个元素,容量开始扩容,扩容大小是10,当我的size到达10之后,再继续添加时,容量是拿当前的容量乘以1.5倍,舍去小数取整,即为新容量大小。

请看如下代码测试:

/**
 * @Description 测试List集合的扩容机制(jdk1.8)
 */
public class Test {

    public static void main(String[] args) {
        //测试默认容量是0,第一次扩容后是10,以后按照1.5倍扩容,即第二次扩容后是15*1.5=22

        //测试默认容量(0)和元素的个数(0)
        ArrayList<Integer> list1 = new ArrayList<>();
        // 获取容量
        Integer capacity = getCapacity(list1);
        int size = list1.size();
        System.out.println("list1的默认容量:" + capacity);
        System.out.println("list1的大小:" + size);
        System.out.println("----------------------------");

        //测试添加1个元素后的容量(10)和元素的个数(1)
        ArrayList<Integer> list2 = new ArrayList<>();
        list2.add(1);
        // 获取容量,arraylist初始化容量是10
        capacity = getCapacity(list2);
        size = list2.size();
        System.out.println("list2的容量:" + capacity);
        System.out.println("list2的大小:" + size);
        System.out.println("----------------------------");

        //测试添加11个元素后的容量(15)和元素的个数(11)
        ArrayList<Integer> list3 = new ArrayList<>();
        // 获取容量,arraylist初始化容量是10
        capacity = getCapacity(list3);
        for (int i = 0; i < 11; i++) {
            list3.add(i);
        }
        capacity = getCapacity(list3);
        size = list3.size();
        System.out.println("list3的容量:" + capacity);
        System.out.println("list3的大小:" + size);
        System.out.println("----------------------------");

        //测试添加16个元素后的容量(15*1.5=22)和元素的个数(16)
        ArrayList<Integer> list4 = new ArrayList<>();
        for (int i = 0; i < 16; i++) {
            list4.add(i);
        }
        capacity = getCapacity(list4);
        size = list4.size();
        System.out.println("list4的容量:" + capacity);
        System.out.println("list4的大小:" + size);

    }

    //获取List的容量
    public static Integer getCapacity(ArrayList list) {
        Integer length = null;
        Class clazz = list.getClass();
        Field field;
        try {
            field = clazz.getDeclaredField("elementData");
            field.setAccessible(true);
            Object[] object = (Object[]) field.get(list);
            length = object.length;
            return length;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return length;

    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值