集合ArrayList源码精解(好理解)

1.类图(JDK11 从idea中得到)

在这里插入图片描述

public class ArrayList<E> extends AbstractList<E>
        implements List<E>, RandomAccess, Cloneable, java.io.Serializable
{
    private static final long serialVersionUID = 8683452581122892189L;

    /**
     * Default initial capacity.
     */
    private static final int DEFAULT_CAPACITY = 10;

从这个类图中,结合代码,我们可以得出结论
此类继承AbstractList,实现了4个接口
默认初始容量是,但是如果你new一个不传参数的ArrayList,size开始是0,但是他会创建一个Object 为10的数组
idea查看方法:(如果idea看不到,请参考:
https://blog.csdn.net/qq_45929019/article/details/128768850

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

public class ArrayListTest {


        public static void main(String[] args) {
            List al=new ArrayList();
            al.add(1);//自动装箱
            System.out.println(al.size());
        }

}

在这里插入图片描述

2.ArrayList底层

看下ArrayList代码,我们可以看到底层是起码为 elemetDate的Object数组,没有指定数组大小
在这里插入图片描述
初始化方法:
在这里插入图片描述
执行的源代码是:

	private static final Object[] EMPTY_ELEMENTDATA = {};
    /**
     * Constructs an empty list with an initial capacity of ten.
     */
    public ArrayList() {
        this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;
    }

总论:空数组赋值给elementData

3.Add方法

执行add 方法:
第一步代码:

   public boolean add(E e) {
        modCount++;
        add(e, elementData, size);
        return true;
    }

第二步代码:(中间代码省略直接到关键代码)

  private int newCapacity(int minCapacity) {
        // overflow-conscious code
        int oldCapacity = elementData.length;
        int newCapacity = oldCapacity + (oldCapacity >> 1);
        if (newCapacity - minCapacity <= 0) {
            if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA)
                return Math.max(DEFAULT_CAPACITY, minCapacity);
            if (minCapacity < 0) // overflow
                throw new OutOfMemoryError();
            return minCapacity;
        }
        return (newCapacity - MAX_ARRAY_SIZE <= 0)
            ? newCapacity
            : hugeCapacity(minCapacity);
    }

在这里插入图片描述
所以往ArrayList插入一个元素,elementData数组由0扩容到10,size还是### 4.扩容

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

public class ArrayListTest {
    public static void main(String[] args) {
        List al= new ArrayList();
        for(int i=1;i<=10;i++) {
            al.add(i);//自动装箱
        }
        al.add(11);

        System.out.println(al.size());
    }
}

在这里插入图片描述
当执行到超过10个元素的时候,数组扩容到15.
分析源码:
在这里插入图片描述
int newCapacity = oldCapacity + (oldCapacity >> 1)
就是新的数组大小=原来的大小+原来的大小右移1位(java中无符号右移一位,类似于除法除2运算)
等同于新的数组大小=原来的大小+原来的大小/2
15=10+10/2
所以ArrayList扩容是1.5倍,没有扩容因子,当数组容量超过最大值时扩容

其他API

ArrayList(int initialCapacity)
构造具有指定初始容量的空列表。

迭代器访问放到单独章节去写

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值