跳转至

Java LinkedList 方法深度解析

简介

在 Java 编程中,LinkedList 是一个常用的集合类,它实现了 List 接口和 Deque 接口。与 ArrayList 不同,LinkedList 基于双向链表数据结构,这使得它在某些操作上具有独特的性能优势。本文将详细介绍 LinkedList 的各种方法,帮助读者更好地理解和使用这一强大的工具。

目录

  1. 基础概念
  2. 常用方法及使用示例
    • 添加元素方法
    • 删除元素方法
    • 获取元素方法
    • 其他方法
  3. 常见实践
    • 遍历 LinkedList
    • 队列和栈的实现
  4. 最佳实践
  5. 小结
  6. 参考资料

基础概念

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 的方法和特性,能够帮助开发者更高效地处理数据集合,优化程序性能。

参考资料