引言

Java集合框架是Java语言中非常重要的一部分,它提供了各种数据结构来存储和操作集合中的对象。List接口是Java集合框架中的一个核心接口,它代表了一组有序的元素集合。本文将深入解析List接口的源码,帮助读者理解Java集合框架的核心原理与实现。

List接口概述

List接口继承自Collection接口,并添加了索引的概念,允许通过索引访问集合中的元素。List接口的主要实现有ArrayListLinkedListVector等。

List接口特点

  • 有序:元素在列表中保持一定的顺序。
  • 可重复:可以包含重复的元素。
  • 可索引:可以通过索引访问元素。

List接口方法

List接口定义了一系列方法,包括:

  • add(E e):在列表末尾添加元素。
  • remove(int index):根据索引删除元素。
  • get(int index):根据索引获取元素。
  • size():获取列表长度。
  • contains(Object o):检查列表是否包含指定元素。
  • iterator():返回列表的迭代器。

ArrayList源码解析

ArrayListList接口的一个非同步实现,它使用数组来存储元素。

构造函数

public ArrayList(int initialCapacity) {
    if (initialCapacity >= 0) {
        this.elementData = new Object[initialCapacity];
    } else {
        throw new IllegalArgumentException("Illegal Capacity: " + initialCapacity);
    }
}

ArrayList的构造函数接受一个初始容量参数,用于创建一个具有指定容量的数组。

add方法

public boolean add(E e) {
    modCount++;
    ensureCapacityInternal(size + 1);
    elementData[size++] = e;
    return true;
}

add方法首先检查容量是否足够,如果不足够,则扩容。然后将元素添加到数组的末尾。

get方法

public E get(int index) {
    rangeCheck(index);
    return (E) elementData[index];
}

get方法根据索引获取元素,并返回。

remove方法

public E remove(int 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方法根据索引删除元素,并返回被删除的元素。

LinkedList源码解析

LinkedListList接口的一个双向链表实现。

构造函数

public LinkedList() {
    header = (Node<E>)new Node<>(null, null, null);
    header.next = header.previous = header;
}

LinkedList的构造函数创建了一个双向链表的头节点。

add方法

public boolean add(E e) {
    linkLast(e);
    return true;
}

add方法将元素添加到链表的末尾。

get方法

public E get(int index) {
    return node(index).item;
}

get方法根据索引获取元素。

remove方法

public E remove(int index) {
    return node(index).item;
}

remove方法根据索引删除元素。

总结

通过解析List接口及其实现类的源码,我们可以深入理解Java集合框架的核心原理与实现。了解这些原理对于编写高效、可维护的Java代码具有重要意义。