LinkedList原理分析

本文详细探讨了ArrayList和LinkedList两种Java集合类的实现方式与性能差异。ArrayList基于数组,适合遍历但插入、删除效率较低;LinkedList适用于指定位置插入和删除,但遍历效率不高。LinkedList作为双端链表,也可用作栈。文章还介绍了LinkedList的内部结构和操作原理,强调了使用迭代器遍历LinkedList的高效性。
摘要由CSDN通过智能技术生成

日常开发中,保存一组数据使用的最多的就是 ArrayList, 其次就是 LinkedList 了。

我们知道 ArrayList 是以数组实现的,遍历时很快,但是插入、删除时都需要移动后面的元素,效率略差些。

LinkedList不是做指定位置插入的话,效率和ArrayList其实是差不多的,当做指定位置插入也就是往中间插入效率比ArrayList快不了多少;做删除也是这个原理,所以在开发中用到集合不怎么会去用到这个LinkedList的一个原因,而且LinkedList的使用场景非常的少。

当要遍历LinkedList里面的数据时,不能使用for(int i = 0;......)这种形式来拿数据,效率极差,LinkedList当中集成了一个迭代器去进行遍历,也可以用增强for(就是迭代器)去遍历,效率要块n多倍;

因为使用迭代器的话里面有个指针每次读完数据并且next()的时候指针会跟着移动每次,基于链表可以高效遍历拿值

使用for(int i = 0;......)的话用get(i)拿值,拿到第i个值就需要迭代i次时间复杂度是平方阶O(n²),及其耗时

LinkedList源码解析

public class LinkedList<E>
    extends AbstractSequentialList<E>
    implements List<E>, Deque<E>, Cloneable, java.io.Serializable

AbstractSequentialList 继承自 AbstractList是LinkedList的父类,是List接口的简化版实现。

AbstractSequentialList 只支持按次序访问,而不像AbstractList那样支持随机访问。

实现了Deque<E>,支持两端元素插入和移除的线性集合。

既具有队列FIFO(先进先出)特点又具有栈LIFO(后进先出)特点,既是队列又是栈。

所以LinkedList还可以当作栈来使用;

LinkedList每次添加 会在堆中随机创建一个Node  然后将一个一个Node串起来形成链表

//LinkedList中的三个属性
//集合里面的元素条数
transient int size = 0;
//从头开始
transient Node<E> first;
//从尾开始
transient Node<E> last;

LinkedList就是基于一个Node对象来讲一个一个的引用链接起来的操作

用first和last来控制LinkedList数据操作       

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;
    }
}

Node一层一层嵌套一层一层引用链接起来实现双端链表

当LinkedList插入4条数据时   里面Node<E> first;和Node<E> last;的运行结果

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值