ArrayList
/**
* 默认初始容量.
*/
private static final int DEFAULT_CAPACITY = 10;
/**
* 用于空实例的共享空数组实例.
*/
private static final Object[] EMPTY_ELEMENTDATA = {};
/**
* 用于默认大小的空实例的共享空数组实例。
* 我们将其与EMPTY_ELEMENTDATA区分开来,以了解在添加第一个元素时应该膨胀多少.
*/
private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};
/**
* 存储ArrayList元素的数组缓冲区。
* ArrayList的容量是这个数组缓冲区的长度。
* 当添加第一个元素时,任何带有elementData==DEFAULTCAPACITY_EMPTY_ELEMENTDATA的空ArrayList都将被扩展为DEFAULT_CAPACITY.
*/
transient Object[] elementData; // non-private to simplify nested class access
/**
* ArrayList的大小(它包含的元素的数量).
*
* @serial
*/
private int size;
/**
* add、remove方法直接或间接的都使用了System.arraycopy
* get、set方法是elementData数组的直接操作
*/
LinkedList
transient int size = 0;
/**
* 指向第一个节点.
* Invariant: (first == null && last == null) ||
* (first.prev == null && first.item != null)
*/
transient Node<E> first;
/**
* 指向最后一个节点.
* Invariant: (first == null && last == null) ||
* (last.next == null && last.item != null)
*/
transient Node<E> last;
/**
* Node<E> 内部类
*/
private static class Node<E> {
E item;
Node<E> next;
Node<E> prev;
Node(Node<E> prev, E element, Node<E> next) {
this.item = element;
this.next = next;
this.prev = prev;
}
}
/**
* add、remove方法使用了链式结构的特性,仅仅修改受影响的添加和删除相邻数据
* get、set方法需要先对Node<E>对象进行轮询查询或设置值
*/
对比ArrayList和LinkedList
初始长度 | 数据结构 | 效率 | 重复 | 线程安全 | 安全问题 | |
ArrayList | 10 | 动态数组 | get、set快,add、remove慢 | 可以 | 否 | size |
LinkedList | 0 | 双向链表 | add、remove快,get、set慢 | 可以 | 否 | 增删 |