Java LinkedList

本文深入解析了LinkedList的特点,包括其在插入删除操作上的高效性及局部化结构的优势,并探讨了其在不同应用场景下的优劣,如操作系统内存管理和数据库冲突解决。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  链表的优点除了插入删除不需要移动其他元素之外,还在于它是一个局部化结构。

public class LinkedList<E>
    extends AbstractSequentialList<E>
    implements List<E>, Deque<E>, Cloneable, java.io.Serializable
{
    transient int size = 0;

    /**
     * Pointer to first node.
     * Invariant: (first == null && last == null) ||
     *            (first.prev == null && first.item != null)
     */
    transient Node<E> first;

    /**
     * Pointer to last node.
     * Invariant: (first == null && last == null) ||
     *            (last.next == null && last.item != null)
     */
    transient Node<E> last;

    /**
     * Constructs an empty list.
     */
    public LinkedList() {
    }
}

  简单看一段源码就能够明白,LinkedList结构上最终的就是利用节点来进行操作,你拿到链表的一个

节点之后,不需要操作太多其它数据,就可以完成插入,删除的操作。而其它的数据结构不行。这是LinkedList所具有的优势。

  但链表并不会节省空间,因为链表有节点。单向链表有指向下一个元素的节点;单项循环链表的最后一个元素有指向第一个元素的节点;双向循环链表有指向前一个元素的节点和指向后一个元素的节点。所以链表不会节省空间。再说时间问题:如果只是插入和删除操作,那么不会移动元素,所以会节省时间,数组的插入和删除是要移动元素的(插入和删除最后一个元素不移动);链表的查找操作是从第一个元素开始,所以相对数组要耗时间(数组直接就可以查找到)。

  所以要看怎样的情况再具体应用,这样才能体会到LinkedList的好处。

  LinkedList 通常在经常需要在 List 中间增删元素的场景下使用。

  LinkedList提供了两个构造方法。

public LinkedList() {    
 header.next = header.previous = header;
 }
public LinkedList(Collection<? extends E> c) {
     this();
   addAll(c);
  第一个构造方法不接受参数,将header实例的previous和next全部指向header实例(注意,这个是一个双向循环链表,如果不是循环链表,空链表的情况应该是header节点的前一节点和后一节点均为null),这样整个链表其实就只有header一个节点,用于表示一个空的链表。 
  执行完构造函数后,header实例自身形成一个闭环。
  第二个构造方法接收一个Collection参数c,调用第一个构造方法构造一个空的链表,之后通过addAll将c中的元素全部添加到链表中。
  在操作系统中,链表用来分配内存,链接了一串空闲内存。分配容易,释放容易。数据库中,比如说字典,就是用链表来解决冲突的,可以参考redis数据库。
  最后需要注意的是:LinkedList是线程不安全的,如果需要线程安全那么请使用synchronized加锁,或者使用vector,或者使用java.util.concurrent包。
  如果需要线程遍历List的时候,避免出现ConcurrentModificationException异常,那么有3种解决方式。
1.遍历List的使用synchronized加锁;
2.使用java.util.concurrent包下面的CopyOnWriteArrayList,每次使用List时实际上都是使用的List副本。
3.使用Jdk8中foreach方法,不过该方法只接受lambda表达式


### Java 中 `LinkedList` 的用法及相关信息 #### 1. 基本概念 `LinkedList` 是 Java 集合框架中的一个重要实现类,它实现了 `List` 接口和 `Deque` (双端队列)接口。与数组列表不同,链表通过节点链接来存储元素[^1]。 #### 2. 创建 `LinkedList` 可以使用默认构造函数创建一个空的 `LinkedList` 实例: ```java import java.util.LinkedList; // Create an empty linked list LinkedList<String> linkedList = new LinkedList<>(); ``` 也可以基于现有集合初始化一个新的 `LinkedList`: ```java import java.util.Arrays; import java.util.LinkedList; // Initialize with existing elements from another collection LinkedList<Integer> numbers = new LinkedList<>(Arrays.asList(1, 2, 3)); ``` #### 3. 添加元素 向 `LinkedList` 插入新项非常灵活,支持多种方式: - 使用 `add(E e)` 方法在列表末尾追加元素; - 利用 `offerFirst(E e)` 或者 `push(E e)` 将对象放置于头部位置; - 调用 `offerLast(E e)` 把数据添加到尾部; 示例如下所示: ```java linkedList.add("first"); linkedList.offerFirst("second"); // Add at the beginning linkedList.push("third"); // Also adds at the start linkedList.offerLast("fourth"); // Adds element at end of queue ``` #### 4. 访问元素 由于 `LinkedList` 同时具备双向迭代特性以及随机访问能力,因此提供了丰富的检索手段: - 获取第一个/最后一个元素:`getFirst()`, `getLast()`; - 查看但不移除头指针所指向的对象:`peek()`, `peekFirst()`, `peekLast()`; - 移动并返回首个匹配项的位置:`indexOf(Object o)`; 具体操作如下: ```java System.out.println(linkedList.getFirst()); // Prints "third" System.out.println(linkedList.peekLast()); // Outputs "fourth" int index = linkedList.indexOf("first"); // Returns position where found or -1 otherwise ``` #### 5. 删除元素 删除功能同样强大而多样: - 清理整个容器的内容:`clear()`; - 取消指定索引处的数据记录:`remove(int index)`; - 弹出栈顶元素(即最先进来的那个):`pop()`; - 自定义条件下的批量清除动作:`removeIf(Predicate<? super E> filter)`; 实际应用例子: ```java linkedList.pop(); // Removes topmost item ("third") linkedList.remove(0); // Deletes entry located at given offset linkedList.removeIf(s -> s.equals("second")); // Filters out all occurrences matching predicate expression ``` #### 6. 特殊用途方法 除了上述常规 API 外,还有几个专用于处理特定场景的方法值得提及: - **反转顺序**:调用 `descendingIterator()` 返回逆序遍历器实例; - **转换成数组形式**:借助 `toArray(T[] a)` 函数可方便地把内部结构映射至目标类型的一维数组上; 代码片段展示这些特性的运用: ```java for(String str : linkedList.descendingIterator()){ System.out.print(str + ", "); } String[] arrayForm = linkedList.toArray(new String[linkedList.size()]); ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值