集合底层添加原理

Arraylist:

     1.ArrayList<Object> list = new ArrayList<>();

        list.add();

    2.思考:

        1.ArrayList底层用什么存的?

        2.存的容器 初始容量是多少?

        3.底层如何添加元素的?

   

    jdk8:ArrayList

        transient=> 不需要进行序列化

        1.ArrayList底层用什么存的? 数组

            Object[] elementData;

        2.存的容器 初始容量是多少?

             1.ArrayList的构造器

                0 不是10。

        3.底层如何添加元素的?ArrayList 。add

            数组

           

2.存的容器 初始容量是多少? 验证  

public ArrayList() {

this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;

}

=》

DEFAULTCAPACITY_EMPTY_ELEMENTDATA

private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};

3.底层如何添加元素的?

    第一次add元素 ,导致底层 数组大小 由0 -》 10  

4.底层是如何扩容的?

    1.元素从第11个开始  10

    2.扩容:int newCapacity = oldCapacity + (oldCapacity >> 1);

        1.5倍进行扩容

   

第一次调用add方法:

size=0

 public boolean add(E e) {

        ensureCapacityInternal(size + 1);  //申请底层数组空间  1

        elementData[size++] = e; // 数组赋值 elementData[0] = e;

        return true;

}

 ensureCapacityInternal(size + 1);  //申请底层数组空间?

  private void ensureCapacityInternal(int minCapacity) { //1

        ensureExplicitCapacity(calculateCapacity(elementData, minCapacity)); //minCapacity

    }

 return Math.max(DEFAULT_CAPACITY, minCapacity); 10 1 => 10

 ensureExplicitCapacity(calculateCapacity(elementData, minCapacity));

 private void ensureExplicitCapacity(int minCapacity) { // 10

        modCount++;

        // overflow-conscious code

        if (minCapacity - elementData.length > 0)

            grow(minCapacity);

    }

grow(minCapacity);=>

private void grow(int minCapacity) {  10

        // overflow-conscious code

        int oldCapacity = elementData.length; 0

        int newCapacity = oldCapacity + (oldCapacity >> 1); 0+ 0*0.5 =0  0

        if (newCapacity - minCapacity < 0)

            newCapacity = minCapacity;    newCapacity =10

        if (newCapacity - MAX_ARRAY_SIZE > 0)

            newCapacity = hugeCapacity(minCapacity);

        // minCapacity is usually close to size, so this is a win:

        elementData = Arrays.copyOf(elementData, newCapacity);

    }

2022.03.17 郭小奕著

萌新上路,轻点喷

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值