ArrayList源码的理解

ArrayList源码的理解

1. ArrayList的属性。

public class ArrayList {
    // 版本号
    private static final long serialVersionUID = 8683452581122892189L;
    // 缺省容量
    private static final int DEFAULT_CAPACITY = 10;
    // 空对象数组
    private static final Object[] EMPTY_ELEMENTDATA = {};
    // 缺省空对象数组
    private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};
    // 元素数组
    transient Object[] elementData;
    // 实际元素大小,默认为0
    private int size;
    // 最大数组容量
    private static final int MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8;
}

2.ArrayList的构造方法

//无参构造
public ArrayList() {
        //DEFAULTCAPACITY_EMPTY_ELEMENTDATA 是个空的Object[],将elementData初始化,elementData也是个Object[]类型,空的object[]长度默认也是0
        this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;
}
//有参构造
public ArrayList(int length) {
		if (length > 0) {
            this.elementData = new Object[initialCapacity];
        } else if (length == 0) {
            this.elementData = EMPTY_ELEMENTDATA;
        } else {
           throw new IllegalArgumentException("Illegal Capacity: "+ initialCapacity); //如输入的长度小于0,将会抛出异常,结束程序。
        }
}

3. ArrayList的方法

3.1 add方法

 public boolean add(E e) { // 添加元素
        if(size)
        elementData[size++] = e;
        return true;
 }

3.2 set方法

public E set(int index, E element) {
     		   // 检验索引是否合法
        	   if(index >= siez ||index <0) {
                    throw new ArrayIndexOutOfBoundsException();
                }
        		// 旧值
       			 E oldValue = elementData(index);
      		  // 赋新值
      		  elementData[index] = element;
       		 // 返回旧值
       		 return oldValue;
    } 

3.3 get方法

public E get(int index) {
         // 检验索引是否合法
        	   if(index >= siez ||index <0) {
                    throw new ArrayIndexOutOfBoundsException();
                }
        return elementData(index);
    }

3.4 remove方法

public E remove(int index){
        if(index < 0 || index >= size()){
            throw new ArrayIndexOutOfBoundsException();
        }
        E removedItem = elementData[index];
        for(int i = index;i < size()-1;i++){
            elementData[i] = elementData[i+1];
        }
        size--;
        return removedItem;
    }

3.5 claer方法

public void clear() {
    	//清除所有元素
        for (int i = 0; i < size; i++){
            elementData[i] = null;
        }
        size = 0;
    }

3.6 toArray方法

public void toArray() {
    for(int i=0;i<size;i++){
        System.out.println(elementData[i]+" ");
    }
}

trimToSize这个方法将ArrayList的动态增加的容量变成了实际容量。

public void trimToSize() {
        modCount++;
        if (size < elementData.length) {
            elementData = (size == 0)
              ? EMPTY_ELEMENTDATA
              : Arrays.copyOf(elementData, size);
        }
    }

ensureCapacity这个方法可以手动进行扩容ArrayList的大小,当一次放入很多数据时,可以先提前手动扩大数组容量,提高效率

  public void ensureCapacity(int minCapacity) {
        if (minCapacity > elementData.length
            && !(elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA
                 && minCapacity <= DEFAULT_CAPACITY)) {
            modCount++;
            grow(minCapacity);
        }
    }

grow这个方法可以扩大ArrayList的容量

    private Object[] grow(int minCapacity) {
        int oldCapacity = elementData.length;
        if (oldCapacity > 0 || elementData != DEFAULTCAPACITY_EMPTY_ELEMENTDATA) {
            int newCapacity = ArraysSupport.newLength(oldCapacity,
                    minCapacity - oldCapacity, /* minimum growth */
                    oldCapacity >> 1           /* preferred growth */);
            return elementData = Arrays.copyOf(elementData, newCapacity);
        } else {
            return elementData = new Object[Math.max(DEFAULT_CAPACITY, minCapacity)];
        }
    }

isEmpty方法是判断是否ArrayList为空,为空返回True,否则返回false

public boolean isEmpty() {
        return size == 0;
}

contains方法判断数组是否包含指定元素,包含则返回那个下标,否则返回-1

    public boolean contains(Object o) {
        return indexOf(o) >= 0;
    }

clone方法是去复制数组给指定数组,当超出数组大小时,会抛出异常

    public Object clone() {
        try {
            ArrayList<?> v = (ArrayList<?>) super.clone();
            v.elementData = Arrays.copyOf(elementData, size);
            v.modCount = 0;
            return v;
        } catch (CloneNotSupportedException e) {
            // this shouldn't happen, since we are Cloneable
            throw new InternalError(e);
        }
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值