Java LinkedList 方法深度解析
简介
在 Java 编程中,LinkedList
是一个常用的集合类,它实现了 List
接口和 Deque
接口。与 ArrayList
不同,LinkedList
基于双向链表数据结构,这使得它在某些操作上具有独特的性能优势。本文将详细介绍 LinkedList
的各种方法,帮助读者更好地理解和使用这一强大的工具。
目录
- 基础概念
- 常用方法及使用示例
- 添加元素方法
- 删除元素方法
- 获取元素方法
- 其他方法
- 常见实践
- 遍历
LinkedList
- 队列和栈的实现
- 遍历
- 最佳实践
- 小结
- 参考资料
基础概念
LinkedList
是 Java 集合框架中的一员,它由一系列节点组成,每个节点包含元素值以及指向前一个节点和后一个节点的引用。这种双向链表结构使得在链表中间插入和删除元素的操作效率较高,时间复杂度为 O(1),而随机访问元素的操作效率相对较低,时间复杂度为 O(n),其中 n 是链表的长度。
常用方法及使用示例
添加元素方法
add(E e)
:将指定元素追加到列表的末尾。
import java.util.LinkedList;
public class LinkedListAddExample {
public static void main(String[] args) {
LinkedList<String> list = new LinkedList<>();
list.add("Apple");
list.add("Banana");
list.add("Cherry");
System.out.println(list);
}
}
add(int index, E element)
:在指定位置插入元素。
import java.util.LinkedList;
public class LinkedListAddAtIndexExample {
public static void main(String[] args) {
LinkedList<String> list = new LinkedList<>();
list.add("Apple");
list.add("Banana");
list.add(1, "Orange");
System.out.println(list);
}
}
addFirst(E e)
:将元素添加到列表的开头。
import java.util.LinkedList;
public class LinkedListAddFirstExample {
public static void main(String[] args) {
LinkedList<String> list = new LinkedList<>();
list.add("Apple");
list.add("Banana");
list.addFirst("Strawberry");
System.out.println(list);
}
}
addLast(E e)
:将元素添加到列表的末尾,等同于add(E e)
。
import java.util.LinkedList;
public class LinkedListAddLastExample {
public static void main(String[] args) {
LinkedList<String> list = new LinkedList<>();
list.add("Apple");
list.add("Banana");
list.addLast("Kiwi");
System.out.println(list);
}
}
删除元素方法
remove()
:移除列表的第一个元素。
import java.util.LinkedList;
public class LinkedListRemoveExample {
public static void main(String[] args) {
LinkedList<String> list = new LinkedList<>();
list.add("Apple");
list.add("Banana");
list.remove();
System.out.println(list);
}
}
remove(int index)
:移除指定位置的元素。
import java.util.LinkedList;
public class LinkedListRemoveAtIndexExample {
public static void main(String[] args) {
LinkedList<String> list = new LinkedList<>();
list.add("Apple");
list.add("Banana");
list.add("Cherry");
list.remove(1);
System.out.println(list);
}
}
remove(Object o)
:移除第一次出现的指定元素。
import java.util.LinkedList;
public class LinkedListRemoveObjectExample {
public static void main(String[] args) {
LinkedList<String> list = new LinkedList<>();
list.add("Apple");
list.add("Banana");
list.add("Apple");
list.remove("Apple");
System.out.println(list);
}
}
removeFirst()
:移除并返回列表的第一个元素。
import java.util.LinkedList;
public class LinkedListRemoveFirstExample {
public static void main(String[] args) {
LinkedList<String> list = new LinkedList<>();
list.add("Apple");
list.add("Banana");
String first = list.removeFirst();
System.out.println("Removed: " + first);
System.out.println(list);
}
}
removeLast()
:移除并返回列表的最后一个元素。
import java.util.LinkedList;
public class LinkedListRemoveLastExample {
public static void main(String[] args) {
LinkedList<String> list = new LinkedList<>();
list.add("Apple");
list.add("Banana");
String last = list.removeLast();
System.out.println("Removed: " + last);
System.out.println(list);
}
}
获取元素方法
get(int index)
:返回指定位置的元素。
import java.util.LinkedList;
public class LinkedListGetExample {
public static void main(String[] args) {
LinkedList<String> list = new LinkedList<>();
list.add("Apple");
list.add("Banana");
list.add("Cherry");
String element = list.get(1);
System.out.println(element);
}
}
getFirst()
:返回列表的第一个元素。
import java.util.LinkedList;
public class LinkedListGetFirstExample {
public static void main(String[] args) {
LinkedList<String> list = new LinkedList<>();
list.add("Apple");
list.add("Banana");
String first = list.getFirst();
System.out.println(first);
}
}
getLast()
:返回列表的最后一个元素。
import java.util.LinkedList;
public class LinkedListGetLastExample {
public static void main(String[] args) {
LinkedList<String> list = new LinkedList<>();
list.add("Apple");
list.add("Banana");
String last = list.getLast();
System.out.println(last);
}
}
其他方法
size()
:返回列表中的元素个数。
import java.util.LinkedList;
public class LinkedListSizeExample {
public static void main(String[] args) {
LinkedList<String> list = new LinkedList<>();
list.add("Apple");
list.add("Banana");
list.add("Cherry");
int size = list.size();
System.out.println("Size: " + size);
}
}
contains(Object o)
:检查列表是否包含指定元素。
import java.util.LinkedList;
public class LinkedListContainsExample {
public static void main(String[] args) {
LinkedList<String> list = new LinkedList<>();
list.add("Apple");
list.add("Banana");
boolean contains = list.contains("Apple");
System.out.println("Contains Apple: " + contains);
}
}
常见实践
遍历 LinkedList
- 使用
for
循环
import java.util.LinkedList;
public class LinkedListTraversalForLoop {
public static void main(String[] args) {
LinkedList<String> list = new LinkedList<>();
list.add("Apple");
list.add("Banana");
list.add("Cherry");
for (int i = 0; i < list.size(); i++) {
System.out.println(list.get(i));
}
}
}
- 使用
foreach
循环
import java.util.LinkedList;
public class LinkedListTraversalForEachLoop {
public static void main(String[] args) {
LinkedList<String> list = new LinkedList<>();
list.add("Apple");
list.add("Banana");
list.add("Cherry");
for (String element : list) {
System.out.println(element);
}
}
}
- 使用迭代器
import java.util.Iterator;
import java.util.LinkedList;
public class LinkedListTraversalIterator {
public static void main(String[] args) {
LinkedList<String> list = new LinkedList<>();
list.add("Apple");
list.add("Banana");
list.add("Cherry");
Iterator<String> iterator = list.iterator();
while (iterator.hasNext()) {
System.out.println(iterator.next());
}
}
}
队列和栈的实现
LinkedList
实现了 Deque
接口,因此可以很方便地用作队列或栈。
- 队列实现
import java.util.LinkedList;
import java.util.Queue;
public class LinkedListAsQueue {
public static void main(String[] args) {
Queue<String> queue = new LinkedList<>();
queue.add("Apple");
queue.add("Banana");
queue.add("Cherry");
while (!queue.isEmpty()) {
System.out.println(queue.poll());
}
}
}
- 栈实现
import java.util.LinkedList;
import java.util.Stack;
public class LinkedListAsStack {
public static void main(String[] args) {
Stack<String> stack = new Stack<>();
stack.push("Apple");
stack.push("Banana");
stack.push("Cherry");
while (!stack.isEmpty()) {
System.out.println(stack.pop());
}
}
}
最佳实践
- 选择合适的数据结构:如果需要频繁进行插入和删除操作,特别是在列表中间,
LinkedList
是一个很好的选择。但如果需要频繁随机访问元素,ArrayList
可能更合适。 - 避免不必要的操作:尽量减少在循环中调用
size()
方法,因为每次调用都需要遍历链表来获取长度。可以将size()
的结果保存到一个变量中。 - 正确使用迭代器:在遍历
LinkedList
并同时修改它时,使用迭代器的remove()
方法来避免ConcurrentModificationException
。
小结
本文详细介绍了 Java LinkedList
的各种方法,包括添加、删除、获取元素以及其他常用操作。通过实际代码示例展示了这些方法的使用方式,并探讨了常见实践和最佳实践。掌握 LinkedList
的方法和特性,能够帮助开发者更高效地处理数据集合,优化程序性能。