Java--ArrayList源码解读

来源:互联网 发布:网站流量统计工具 知乎 编辑:程序博客网 时间:2024/05/16 04:01

ArrayList 源码解读

ArrayList 的sizeisEmptygetsetiterator 和 listIterator 操作都以固定时间运行。add 操作以分摊的固定时间 运行,也就是说,添加 n 个元素需要 O(n) 时间。其是不同步的。

public class ArrayList<E> extends AbstractList<E>
        implements List<E>, RandomAccess, Cloneable, java.io.Serializable
继承AbstractList类,实现List,RandomAccess,CloneableSerializable接口。

public ArrayList() {<h4>this(10);</h4>    }
默认的初始容量为10。

  <span style="font-style: normal;"> public void ensureCapacity(int minCapacity) {modCount++;int oldCapacity = elementData.length;if (minCapacity > oldCapacity) {    Object oldData[] = elementData;    int newCapacity = (oldCapacity * 3)/2 + 1;        if (newCapacity < minCapacity)newCapacity = minCapacity;            // minCapacity is usually close to size, so this is a win:            elementData = Arrays.copyOf(elementData, newCapacity);}    }</span>

ensureCapacity 方法来确认容量应扩为多少。


public E get(int index) {RangeCheck(index);return (E) elementData[index];    }
get方法,RangeCheck()方法检查索引是否合法。

public E set(int index, E element) {RangeCheck(index);E oldValue = (E) elementData[index];elementData[index] = element;return oldValue;    }
set方法,返回旧值。

 public void add(int index, E element) {if (index > size || index < 0)    throw new IndexOutOfBoundsException("Index: "+index+", Size: "+size);ensureCapacity(size+1);  // Increments modCount!!System.arraycopy(elementData, index, elementData, index + 1, size - index);elementData[index] = element;size++;    }

add方法,当插入数组中的位置时,需要将其后面的数值依次后移。

public E remove(int index) {RangeCheck(index);modCount++;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 workreturn oldValue;    }


与add()方法类似,将后面的值依次前移一位,并返回删除的值。

0 0
原创粉丝点击