ArrayList LinkedList源码解析(4)

/**
*删除指定元素o,分为两种情况,若指定元素o为null,则遍历当前的elementData数组,如果某一个下标index上面的值为null(==),则调用方法fastRemove(int)快速删除该元素,然后返回true
*若指定元素o不为0,则遍历elementData数组,若某一个下标index处的元素和指定元素o 进行equals 为true的话,则调用fastRemove(int)快速删除该元素,然后返回true
*由下面的源码可知,只能删除第一个匹配的元素。
*/
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;
}

/**
*快速删除指定下标index的元素,不做边界检查(该方法时private的)
*/
private void fastRemove(int index) {
        modCount++;
        int numMoved = size - index - 1;
        if (numMoved > 0)
       //里面进行了数组元素的移动,将index后面的元素往前复制一位
            System.arraycopy(elementData, index+1, elementData, index,
                            numMoved);
     //将数组elementData中最后一个位置置为null,以便释放已用,让gc 回收
        elementData[--size] = null; // Let gc do its work
 }

/**
*删除指定下标index处的元素,该方法相比remove(Object o)方法,多了一个边界检查,但是少了元素的查找过程,因此性能更好一些。
*/
public E remove(int index) {
    //对入参index做边界检查
    RangeCheck(index);

modCount++;
  //取出index位置的元素
    E oldValue = (E) elementData[index];

int numMoved = size - index - 1;
    if (numMoved > 0)
        //进行数组元素的移动
        System.arraycopy(elementData, index+1, elementData, index,
                numMoved);
    elementData[--size] = null; // Let gc do its work
    //返回原来index位置的旧元素
    return oldValue;
}

元素的搜索:

/**
*获取指定下标index处的元素,先进行边界检查,然后直接返回elementData数组中对应位置index处的元素。
*/
public E get(int index) {
    RangeCheck(index);

return (E) elementData[index];
}

/**
*判断集合中是否包含指定元素o,调用indexOf(Object o)方法实现
*/
public boolean contains(Object o) {
    return indexOf(o) >= 0;
}

/**
*返回指定元素o在数组elementData首次出现的下标,这里也是分为两种情况:
*1.指定元素o为null 2.指定元素o不为null,在查询元素的过程中,o为null,使用 == 比较,o不为null,使用equals比较,若找到了该元素,则返回其在数组elementData中的下标index,若找不到这返回-1.
*/
public int indexOf(Object o) {
    if (o == null) {
        for (int i = 0; i < size; i++)
        if (elementData[i]==null)
            return i;
    } else {
        for (int i = 0; i < size; i++)
        if (o.equals(elementData[i]))
            return i;
    }
    return -1;
}

与indexOf(Object o)方法类似的是 lastIndexOf(Object o)方法,不同的是 后者返回的是最后一次出现指定元素o的位置下标。

public int lastIndexOf(Object o) {
    if (o == null) {
        for (int i = size-1; i >= 0; i--)
        if (elementData[i]==null)
            return i;
    } else {
        for (int i = size-1; i >= 0; i--)
        if (o.equals(elementData[i]))
            return i;
    }
    return -1;
}

我们再看一下ArrayList的迭代器方法如何实现的:

/**
*该方法是有ArrayList的父类AbstractList持有的,返回的是一个Itr对象
*/
public Iterator<E> iterator() {
    return new Itr();
}

我们看看Itr是个什么鬼:

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/a28bd8cda7fd42444934c8d7ef084553.html