ArrayList集合源码解析

首先第一点就是我们能够看见ArrayList集合类主要是java.util包下面的一个类。这个类主要继承了AbstractList类,以及实现了List接口

//arrayList主要是位于java.util这个类库下面的类
package java.util;

//这个类主要实现哪些接口以及继承了哪些类
public class ArrayList<E> extends AbstractList<E>
        implements List<E>, RandomAccess, Cloneable, java.io.Seriali

第二点看下它里面定义的属性以及他们之间的作用

//静态常量初始值设置为:10
private static final int DEFAULT_CAPACITY = 10;

//空元素数组
 private static final Object[] EMPTY_ELEMENTDATA = {};

//默认初始空元素数据
private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};

//Object数组用elementData变量表示
transient Object[] elementData;

//其中我们能够看见transient只能够修饰变量,变量不能变成持久化的一部分,该变量内容序列化之后不能被访问

//访问arrayList集合的长度
 private int size;

第三:add(Element e)方法源码解析

/**
*这个方法首先是判断是否扩容处理,然后在原来的数组的size+1索引赋值为e
*/
public boolean add(E e) {
      //数组复制,并且判断size+1的容量判断
        ensureCapacityInternal(size + 1);  // Increments modCount!!
        elementData[size++] = e;
        return true;
    }

//还是数组复制,calculateCapacity是判断当前数组的容量大小判断
private void ensureCapacityInternal(int minCapacity) {
        ensureExplicitCapacity(calculateCapacity(elementData, minCapacity));
    }

//判断数组中的元素是否为默认的数组,如果是就取默认容量与size +1两者中的最大值,否则就会取size +1的值
private static int calculateCapacity(Object[] elementData, int minCapacity) {
        if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) {
            return Math.max(DEFAULT_CAPACITY, minCapacity);
        }
        return minCapacity;
    }


//这个方法中主要是记录了集合中元素的改变以及判断size+1与数组的长度大小比较,如果超出就需要进行扩容操作
private void ensureExplicitCapacity(int minCapacity) {
        modCount++;

        // overflow-conscious code
        if (minCapacity - elementData.length > 0)
            grow(minCapacity);
    }


//首先将原来数组的长度进行扩大的操作  int newCapacity = oldCapacity + (oldCapacity >> 1); 也就是将这里原来的容量进行增加1.5倍
 elementData = Arrays.copyOf(elementData, newCapacity);  核心的代码其实就是这行将原来的数组利用system.arraycopy方法进行数组复制
  private void grow(int minCapacity) {
        // overflow-conscious code
        int oldCapacity = elementData.length;
        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);
    }

第四点:remove(int index)方法的源码解析

/**
这个方法主要的逻辑就是首先校验index是否超过数组的长度,然后就是记录modCount操作次数,计算出需要移动的元素个数,再调用System.copyof()方法进行数组复制,然后将数组的--size元素赋值为null值
public E remove(int index) {
        rangeCheck(index);

        modCount++;
        E oldValue = elementData(index);

        int numMoved = size - index - 1;
        if (numMoved > 0)
            System.arraycopy(elementData, index+1, elementData, index,
                             numMoved);
        elementData[--size] = null; // clear to let GC do its work

        return oldValue;
    }

第五点:remove(Object obj)方法解析,首先我们可以看一下源码的解析

/**‘
首先是判断元素是否为null,如果为null值那么就循环遍历数组,找出第一次出现null的元素然后就是调用fastremove(int index)方法,不为null值时那么就调用Object中的equals方法,然后就调用fastremove方法
public boolean remove(Object o) {
        if (o == null) {
            for (int index = 0; index < size; index++)
                if (elementData[index] == null) {
                    fastRemove(index);
                    return true;
                }
        } else {
            for (int index = 0; index < size; index++)
                if (o.equals(elementData[index])) {
                    fastRemove(index);
                    return true;
                }
        }
        return false;
    }
    
    
/**
其实我们在查看fastremove方法时,我们能够看到这里面的思路是跟我们前面找到的remove(int index)是一样的
private void fastRemove(int index) {
        modCount++;
        int numMoved = size - index - 1;
        if (numMoved > 0)
            System.arraycopy(elementData, index+1, elementData, index,
                             numMoved);
        elementData[--size] = null; // clear to let GC do its work
    }

第五点get(int index)

/**
首先是对index的索引下标值进行校验,符合之后的话,就直接调用数组中的索引
public E get(int index) {
        rangeCheck(index);

        return elementData(index);
    }
发布了51 篇原创文章 · 获赞 0 · 访问量 763

猜你喜欢

转载自blog.csdn.net/a_liuren/article/details/103545691