ArrayList扩容机制的简单总结

简单总结复习刚学到的ArrayList扩容机制

什么是ArrayList?

ArrayList是java中集合的一种,实际上是一个动态数组,底层是用数组实现的,随机访问效率高,随机删除、修改效率低、线程不安全``

ArrayList扩容机制

打开idea中ArrayList类的源码,ArrayList中有两个属性,size:表示ArrayList的长度,elementData数组:用来存储数据的数组。
在Arraylist扩容时,调用Add方法,
###方法中会首先判断得到最小扩容量,如果你构造的ArrayList是用无参构造,即你创建ArrayList时没有确定它的长度,最小扩容量就为10和size+1当中的最大值,
###然后再判断是否需要扩容,如果最小扩容量大于elementData.length,就需要扩容,然后调用grow()方法,其中旧容量为elementData.length,新容量为elementData.length的1.5倍(new=old+old>>1),
##若新容量大于size+1,最小需要容量就为新容量,若新容量小于size+1,最小需要容量就为size+1,之后再将原来的数组用Arrays.copyOf方法复制到新数组,使新数组的长度为最小需要容量。

自己实现的扩容demo

package data.test;

import java.util.Arrays;

public class MyArrayList {
    //保存数据的数组
    private Object [] elementData;
    private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};
    //数组的长度
    private Integer size;

    public MyArrayList(){
        elementData=DEFAULTCAPACITY_EMPTY_ELEMENTDATA;
    }
    public MyArrayList(Integer num){elementData=new Object[num];}

    public boolean add(Object o){
        Integer mincapity;
        if(elementData==DEFAULTCAPACITY_EMPTY_ELEMENTDATA){
            mincapity=Math.max(10,size+1);
        }
        else {
            mincapity=size+1;
        }
        need(mincapity);
        elementData[size++]=o;
        return true;
    }
    public void need(Integer mincapity){
        if(mincapity<elementData.length){
            return;
        }
        else {
            grow(mincapity);
            return;
        }
    }

    public void grow(Integer mincapity){
        Integer oldcapity=elementData.length;
        Integer newcapity=oldcapity+(oldcapity>>1);
        Integer needCapity;
        if(size+1>newcapity){
            needCapity=size+1;
        }
        else {
            needCapity=newcapity;
        }
        Arrays.copyOf(elementData,needCapity);
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值