赞
踩
LinkedList
在Java中是一个实现了List
和Deque
接口的双向链表。它允许我们在列表的两端添加或删除元素,同时也支持在列表中间插入或移除元素。在分析LinkedList
之前,需要理解链表这种数据结构:
LinkedList
的数据结构在LinkedList
中,每个元素都是一个节点,每个节点包含三个部分:存储的数据项、指向前一个节点的引用和指向后一个节点的引用。
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;
}
}
LinkedList
的核心方法LinkedList
实现了List
接口,所以它具有诸如add
, remove
, get
, set
等方法,同时也实现了Deque
接口,这意味着它也具有offer
, poll
, push
, pop
等方法。
以下是LinkedList
中一些关键方法的简化版源码:
public class LinkedList<E> extends AbstractSequentialList<E> implements List<E>, Deque<E>, Cloneable, java.io.Serializable { transient int size = 0; transient Node<E> first; transient Node<E> last; public LinkedList() { } public boolean add(E e) { linkLast(e); return true; } void linkLast(E e) { final Node<E> l = last; final Node<E> newNode = new Node<>(l, e, null); last = newNode; if (l == null) first = newNode; else l.next = newNode; size++; modCount++; } public E remove() { return unlinkFirst(first); } private E unlinkFirst(Node<E> f) { final E element = f.item; final Node<E> next = f.next; f.item = null; f.next = null; first = next; if (next == null) last = null; else next.prev = null; size--; modCount++; return element; } public E get(int index) { checkElementIndex(index); return node(index).item; } Node<E> node(int index) { if (index < (size >> 1)) { Node<E> x = first; for (int i = 0; i < index; i++) x = x.next; return x; } else { Node<E> x = last; for (int i = size - 1; i > index; i--) x = x.prev; return x; } } // 省略其他细节实现 }
下面是LinkedList
的一个简单使用示例:
import java.util.LinkedList; public class Main { public static void main(String[] args) { LinkedList<String> friends = new LinkedList<>(); // 添加元素 friends.add("Alice"); friends.add("Bob"); friends.add("Charlie"); // 打印所有元素 System.out.println("Initial LinkedList: " + friends); // 删除第一个元素 friends.remove(); // 打印删除元素后的列表 System.out.println("After removal: " + friends); // 获取特定位置的元素 String friend = friends.get(1); System.out.println("Second friend: " + friend); } }
使用LinkedList
时,有几个细节需要注意:
LinkedList
是基于节点的,因此它可以动态地添加或删除节点而不需要像数组那样重新分配整个数据结构。LinkedList
必须从头开始(或从尾开始,取决于哪边更近)遍历节点。因此,随机访问的效率远低于数组。LinkedList
只需要改变几个引用,这使得插入和删除操作非常快速。LinkedList
的每个元素都需要额外的内存空间来存储前后节点的引用。通过以上解析,我们可以深入理解LinkedList
的工作原理和设计。这有助于开发者在需要适合的数据结构时作出明智的选择。对于需要频繁插入和删除操作的场景,LinkedList
可能是一个不错的选择。然而,如果需要快速通过索引访问元素,那么ArrayList
可能是更好的选择。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。