ArrayList LinkedList源码解析

Java中,集合这一数据结构应用广泛,应用最多的莫过于List接口下面的ArrayList和LinkedList;

我们先说List,

public interface List<E> extends Collection<E> {
    //返回list集合中元素的数量,若数量大于Integer.MAX_VALUE,则返回Integer.MAX_VALUE
    int size();

//判读集合内是否没有元素,若没有元素返回true
    boolean isEmpty();

//判断集合内是否包含指定的元素o
    boolean contains(Object o);

//以适当的序列,返回该集合元素中的一个迭代器
    Iterator<E> iterator();

//返回一个数组,该数组包含该集合中所有的元素(以从first到last的顺序)
    Object[] toArray();

//把集合中的元素放到数组a中,并返回
    <T> T[] toArray(T[] a);
20   
    //向集合末尾中添加一个元素
    boolean add(E e);

//从集合中删除第一个出现的元素o
    boolean remove(Object o);


    //判断集合中是否包含 指定集合c中的所有元素
    boolean containsAll(Collection<?> c);

//将指定集合c中的所有元素都追加到 集合的末尾
    boolean addAll(Collection<? extends E> c);

//将指定集合c中的所有元素都插入到 集合中,插入的开始位置为index
    boolean addAll(int index, Collection<? extends E> c);

//将指定集合c中的所有元素从本集合中删除
    boolean removeAll(Collection<?> c);

//本集合和 集合c的交集
    boolean retainAll(Collection<?> c);

//清除集合中的元素
    void clear();

//比较指定对象o和本集合是否相等,只有指定对象为list,size大小和本集合size一样,且每个元素equal一样的情况下,才返回true
    boolean equals(Object o);


    int hashCode();

//返回指定位置index的元素
    E get(int index);

//将元素element设置到集合的index位置(替换)
    E set(int index, E element);

//将元素element插入到集合的index位置
    void add(int index, E element);

//移除指定位置index的元素
    E remove(int index);

//返回指定对象o在本集合中的第一个索引位置
    int indexOf(Object o);

//返回指定对象o在本集合中的最后一个索引位置
    int lastIndexOf(Object o);

//返回一个ListIterator的迭代器
    ListIterator<E> listIterator();

//从指定位置index开始返回一个ListInterator迭代器
    ListIterator<E> listIterator(int index);

//返回从位置fromIndex开始到位置toIndex结束的子集合
    List<E> subList(int fromIndex, int toIndex);
}

下面我们看一看ArrayList,ArrayList是基于数组的方式来实现数据的增加、删除、修改、搜索的。

ArrayList内部维护者两个变量:


//该数组缓存者集合中的元素,集合的容量就是该数组的长度,elementData用transient修饰,说明在序列化时,数组elementData不在序列化范围内。
private transient Object[] elementData;

//集合的大小 (集合中元素的数量)
private int size;


我们再看一看ArrayList的构造器:

/**
*构造一个指定容量initialCapacity的空的集合,
*super() 是调用AbstractList的默认构造器方法,该方法是一个空的方法,
*然后判断传入的参数initialCapacity不能小于0,否则就直接抛出非法参数异常;
*最后直接创建了一个长度为initialCapacity的数组对象,并将该对象赋值给当前实例的elementData属性,用以存放集合中的元素。
*/
 public ArrayList(int initialCapacity) {
    super();
        if (initialCapacity < 0)
            throw new IllegalArgumentException("Illegal Capacity: "+
                                              initialCapacity);
    this.elementData = new Object[initialCapacity];
}
/**
*构造一个默认的容量为10的空的集合,我们平时最经常使用的List<T> list = new ArrayList<T>();是默认创建了容量为10的集合。
*/
public ArrayList() {
    this(10);
}

/**
*构造一个包含了指定集合c中的所有元素的集合,该集合中元素的顺序是以集合c的迭代器返回元素的顺序。
*/
public ArrayList(Collection<? extends E> c) {
    elementData = c.toArray();
    size = elementData.length;
    // c.toArray might (incorrectly) not return Object[]
    if (elementData.getClass() != Object[].class)
        elementData = Arrays.copyOf(elementData, size, Object[].class);
}

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

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