LinkedList是List家族除ArrayList之外最为常用的另一成员,今天一文彻底搞懂LinkedList。
底层数据结构
LinkedList底层是一个双向链表:
transient Node<E> first;
transient Node<E> last;
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对象的item中,并保留指向上一节点、下一节点的对象。
再为整个LinkedList定义首节点first,尾结点last,方便对LinkedList的正向或逆向访问。
LinkedList的容量
不使用数组存储数据,所以不存在容量的概念,可以无限存入。
数据存入
add(E e)/addlast(E e):追加数据到链表尾部。
addfirst(E e):追加数据到链表头部。
push(E e):压栈,等同于addfirst。
add(int index, E element):追加数据到链表指定位置。
addAll(Collection<? extends E> c):追加集合c中的所有数据到链表尾部。
addAll(int index,Collection<? extends E> c):追加集合c中的所有数据到链表指定位置。
获取数据
contains(Object o):判断链表是否包含目标对象。
peek():获取链表第一个对象,并且不从链表中一处对象(不出栈)。
get(int index):获取指定位置对象。
pop():获取链表第一个数据并出栈。
removeFirst():等同于pop。
由于LinkedList是双向链表结构,实现了Deque接口,提供了一系列非常方便的队列操作方法,所以,如果有类似比如先进先出、先进后出等队列操作需求的场景,LinkedList是首选。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。