ArrayList源码

ArrayList使用数组实现。非线程安全的,Vector来说是线程安全的,在ArrayList的基础上加上了synchronized关键字。

transient关键字:被它修饰的属性在反序列化的时候反不出来

add方法:

/**

* Shared empty array instance used for empty instances.

*/

private static final Object[] EMPTY_ELEMENTDATA = {};



/**

* The array buffer into which the elements of the ArrayList are stored.

* The capacity of the ArrayList is the length of this array buffer. Any

* empty ArrayList with elementData == EMPTY_ELEMENTDATA will be expanded to

* DEFAULT_CAPACITY when the first element is added.

*/

private transient Object[] elementData;



public boolean add(E e) {

    //1.首先确保数组长度足够长

    ensureCapacityInternal(size + 1); // Increments modCount!!

    elementData[size++] = e;

    return true;

}



private void ensureCapacityInternal(int minCapacity) {

    //初始化arrayList数组

    if (elementData == EMPTY_ELEMENTDATA) {

    minCapacity = Math.max(DEFAULT_CAPACITY, minCapacity);

}



    ensureExplicitCapacity(minCapacity);

}



private void ensureExplicitCapacity(int minCapacity) {

    modCount++;



    // overflow-conscious code

    //如果添加一个元素后,数组长度溢出。那么将自动增长该数组

    if (minCapacity - elementData.length > 0)

    grow(minCapacity);

}



private void grow(int minCapacity) {

    // overflow-conscious code

    int oldCapacity = elementData.length;

    //将新的数组长度设置为旧数组长度的1.5倍

    int newCapacity = oldCapacity + (oldCapacity >> 1);

    if (newCapacity - minCapacity < 0)

        newCapacity = minCapacity;

    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);

}



private static final int MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8;

private static int hugeCapacity(int minCapacity) {

    if (minCapacity < 0) // overflow

    throw new OutOfMemoryError();

    return (minCapacity > MAX_ARRAY_SIZE) ?

    Integer.MAX_VALUE :

    MAX_ARRAY_SIZE;

}

 

转载于:https://my.oschina.net/u/3711426/blog/1808754

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值