ArrayList
-
ArrayList底层是用数组实现的存储。
-
特点:查询效率高,增删效率低,线程不安全。使用频率很高。
-
通过无参构造方法的方式ArrayList()初始化,则赋值底层数Object[] elementData为一个默认空数组Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {}所以数组容量为0,只有真正对数据进行添加add时,才分配默认DEFAULT_CAPACITY = 10的初始容量。
-
扩容
1.第一步他会重新定义一个长度为之前数组长度1.5倍的数组
2.然后把原数组的数据,原封不动的复制到新数组中,这个时候再把指向原数的地址换到新数组,ArrayList就这样完成了一次改头换面。 -
实现接口
实现了RandomAccess接口,可以随机访问
实现了Cloneable接口,可以克隆
实现了Serializable接口,可以序列化、反序列化
实现了List接口,是List的实现类之一
实现了Collection接口,是Java Collections Framework成员之一
实现了Iterable接口,可以使用for-each迭代
LinkedList
- LinkedList 是基于链表实现的,除了 LIst 接口之外,LinkedList 还实现了 Deque,Cloneable,Serializable 三个接口。这说明该数据结构支持队列,克隆和序列化操作的。与 ArrayList 一样,允许 null 元素的存在,且是不支持多线程的。
- LinkedList 提供了以下三个成员变量。size,first,last。
transient int size = 0;
transient Node<E> first;
transient Node<E> last;
其中 size 为 LinkedList 的大小,first 和 last 分别为链表的头结点和尾节点。Node 为节点对象。
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;
}
}
Node 是 LInkedList 的内部类,定义了存储的数据元素,前一个节点和后一个节点,典型的双链表结构。