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<E>
    extends AbstractSequentialList<E>
    implements List<E>, Deque<E>, Cloneable, java.io.Serializable
{
    
    //操作数
    protected transient int modCount = 0;
    
    transient int size = 0;//相当于指针
    
    transient Node<E> first;//第一个结点		 -- 		 null
    
    transient Node<E> last;//最后一个结点		--			null
    
    //无参构造
    public LinkedList() {
    }
    
    //有参构造
    public LinkedList(Collection<? extends E> c) {
        this();
        addAll(c);
    }
    
    //add方法的底层
    public boolean add(E e) {
        linkLast(e);
        return true;
    }
    
    void linkLast(E e) {
        final Node<E> l = last;
        final Node<E> newNode = new Node<>(l, e, null);
        last = newNode;
        if (l == null)
            first = newNode;
        else
            l.next = newNode;
        size++;
        modCount++;
    }
    
    //节点类
    private static class Node<E> {
        E item; ------- 元素
        Node<E> next; - 下一个节点地址
        Node<E> prev; - 上一个节点地址

        Node(Node<E> prev, E element, Node<E> next) {
            this.item = element;
            this.next = next;
            this.prev = prev;
        }
    }
    
    public boolean addAll(Collection<? extends E> c) {
        return addAll(size, c);
    } 
    
}
LinkedList<String> 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,因为业务中的查询是最多的

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值