ArraysList源码分析

java中集合的源码经常在面试中被问到,这里我简单复制啦一段源码,范围是ArrayList类的构造方法重载结束
public class ArrayList<E> extends AbstractList<E>
        implements List<E>, RandomAccess, Cloneable, java.io.Serializable
{
    private static final long serialVersionUID = 8683452581122892189L;
    //设置Arrays的默认容量大小是10,注意是final修饰的,只能赋值一次
    private static final int DEFAULT_CAPACITY = 10;
    
    private static final Object[] EMPTY_ELEMENTDATA = {};

    private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};

   //定义一个Object类型的数组,transient是一个修饰符,表示该数组不被序列化
    transient Object[] elementData; // non-private to simplify nested class access

   //定义啦一个大小
    private int size;

   //构造方法的重载,这个方法重载是为啦定义ArraysList的容量大小,创建ArraysList对象时候要传    入一个int作为集合大小
    public ArrayList(int initialCapacity) {

        if (initialCapacity > 0) {
//传入的值大于0的时候就让,elementData数组的大小为initialCapacity
            this.elementData = new Object[initialCapacity];
        } else if (initialCapacity == 0) {
//如果你传入一个零就让数组等于默认EMPTY_ELEMENTDATA
            this.elementData = EMPTY_ELEMENTDATA;
        } else {
            throw new IllegalArgumentException("Illegal Capacity: "+
                                               initialCapacity);
        }
//***在这里可以总结出来如果你要设置集合的大小,传入的int值必须为大于等于0的值
//,如果为负数就会抛出IllegalArgumentException异常
    }

   //你也可以不设置集合大小使用默认的容量10
    public ArrayList() {
        this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;
    }

  //传入一个集合
    public ArrayList(Collection<? extends E> c) {
//把这个集合转为数组
        elementData = c.toArray();
//这个数组长度赋值给size后 不为0
        if ((size = elementData.length) != 0) {
           //判断这个数组的类型是否属于Object[]类
            if (elementData.getClass() != Object[].class)
              //克隆这个数组赋值给elementData
                elementData = Arrays.copyOf(elementData, size, Object[].class);
        } else {
            // 数组长度为零,让当前elementData值为EMPTY_ELEMENTDATA
            this.elementData = EMPTY_ELEMENTDATA;
        }
    }
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值