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

LinkedList底层源码流程

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

LinkedList底层源码流程

LinkedList 一、简介

LinkedList同时实现了List接口和Deque接口,也就是既可以把它看作一个顺序容器,又可以看作一个队列(Queue),同时又可以看作一个栈(stack),这样看来,linkedList简直就是无敌的,当你需要使用栈或者队列时,可以考虑用LinkedList,一方面是因为Java官方已经声明不建议使用Stack类,更遗憾的是,Java里根本没有一个叫做Queue的类(只是一个接口的名字)。关于栈或队列,现在首选是ArrayDeque,它有着比LinkedList(当作栈或队列使用时)更好的性能。

二、常用方法
方法名用法描述
add引用.add(元素);将指定的元素追加到此列表的末尾。
add(int index, E element)引用.add(index, 元素);在此列表中的指定位置插入指定的元素
addAllConllections.addAll按照指定集合的迭代器返回的顺序将指定集合中的所有元素追加到此列表的末尾。
addFirst引用.addFirst(元素)在该列表开头插入指定的元素。
addLast引用.addLast(元素)将指定的元素追加到此列表的末尾。
clear引用.clear();从列表中删除所有元素。
contains引用.contains(元素)如果此列表包含指定的元素,则返回 true
get引用.get(int index)返回此列表中指定位置的元素。
getFirst引用.getFirst返回此列表中的第一个元素。
getLast引用.getLast返回此列表中的最后一个元素。
indexOf引用.indexOf返回此列表中指定元素的第一次出现的索引,如果此列表不包含元素,则返回-1。
lastIndexOf引用.lastIndexOf返回此列表中指定元素的最后一次出现的索引,如果此列表不包含元素,则返回-1。
contains引用.contains判断集合中是否有指定集合(判断包含关系)
isEmpty引用.isEmpty判断集合中是否没有元素
remove引用.remove(元素)依据元素删除元素
remove引用.remove(index)依据下标删除元素
removeAll引用.removeAll去除交集
retainAll引用.retainAll保留交集
三、手撕底层源码
public class LinkedList
    extends AbstractSequentialList
    implements List, Deque, Cloneable, java.io.Serializable
{
    
    //操作数
    protected transient int modCount = 0;
    
    transient int size = 0;//相当于指针
    
    transient Node first;//第一个结点		 -- 		 null
    
    transient Node last;//最后一个结点		--			null
    
    //无参构造
    public LinkedList() {
    }
    
    //有参构造
    public LinkedList(Collection c) {
        this();
        addAll(c);
    }
    
    //add方法的底层
    public boolean add(E e) {
        linkLast(e);
        return true;
    }
    
    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++;
    }
    
    //节点类
    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;
        }
    }
    
    public boolean addAll(Collection c) {
        return addAll(size, c);
    } 
    
}
LinkedList list = new LinkedList<>();

list.add("孙悟空");
list.add("猪八戒");
list.add("沙和尚");
list.add("小哪吒");
list.add("二郎神");
总结

LinkedList底层数据结构为双向链表

ArrayList vs LinkedList

ArrayList 的应用场景:存储数据(如果要存的数据没有特殊要求,就使用ArrayList)

LinkedList 的应用场景:队列模式、栈模式

效率区别:

ArrayList 数据结构:一维数组(一维数组开辟的空间是连续的)

LinkedList数据结构:双向链表(双向链表就是一个一个的对象,内存空间不是连续的)

添加 - 不扩容:ArrayList快

添加 - 扩容:LinkedList快

删除:LinkedList快

修改:ArrayList快(因为修改之前需要查询到某个元素)

查询:ArrayList快

在处理业务中,多使用ArrayList,因为业务中的查询是最多的

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

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

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