栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

LinkedList 类原码分析

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

LinkedList 类原码分析

1,底层是 双向链表 和 双端队列

2,可以添加 任意 重复 和 null 元素

3,线程不安全,没有实现同步


底层维护的是一个静态内部类

private static class Node {
        E item;
        Node next;
        Node prev;

        Node(Node prev, E element, Node next) {
            this.item = element;
            this.next = next;
            this.prev = prev;
        }
    }

LinkedList类的常见方法: 增 
list.add("ycq");

调用了LinkedList 的Add()方法

public boolean add(E e) {
        linkLast(e);
        return true;
    }

我们发现add(E e)方法右调用了一个无返回的方法void linkLast(E e),我们再查看这个方法的原码定义:

void linkLast(E e) {
        final Node l = last;
        final Node newNode = new Node<>(l, e, null);
        last = newNode;
        if (l == null)
            first = newNode;
        else
            l.next = newNode;
        size++;
        modCount++;
    }

它做的工作就是将新元素放进新的小容器内(Noed对象),再将下表头指向一开始链表的最后一个元素,再将一开始链表的最后一个元素上表头指向新的小容器

我们再看一下小容器类(Noed)的构造器都做了什么吧。

Node(Node prev, E element, Node next) {
            this.item = element;
            this.next = next;
            this.prev = prev;
        }

这个小容器的构造器,把元素放进新建的小容器内,然后把这个小容器的上表头和下表头分别指向传进来的实参上。


删
list.remove("ycq02");

首先调用了方法boolean remove(Object o),进行删除操作。让我们看一下remove方法是怎么进行删除链表元素的。

public boolean remove(Object o) {
        if (o == null) {
            for (Node x = first; x != null; x = x.next) {
                if (x.item == null) {
                    unlink(x);
                    return true;
                }
            }
        } else {
            for (Node x = first; x != null; x = x.next) {
                if (o.equals(x.item)) {
                    unlink(x);
                    return true;
                }
            }
        }
        return false;
    }

进来先判断o等不等于空,等于空执行①,不等于空执行②

①,从前往后遍历,,如果找到空了,就调用方法:E unlink(Node x)进行删除。

②,从前往后遍历,,如果找到o了,就调用方法:E unlink(Node x)进行删除。

那么我们就来看看E unlink(Node x)方法是怎么回事的吧。

E unlink(Node x) {//x = 要删除的小容器
        // assert x != null;
        final E element = x.item;
        final Node next = x.next;
        final Node prev = x.prev;

        if (prev == null) {
            first = next;
        } else {
            prev.next = next;
            x.prev = null;
        }

        if (next == null) {
            last = prev;
        } else {
            next.prev = prev;
            x.next = null;
        }

        x.item = null;
        size--;
        modCount++;
        return element;
    }

这个方法做的工作就是将要删除的小容器的上下表头和元素指向都置空,并将要删除的小容器左右上下表头连接起来。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/936933.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号