Java源码之LinkedList

一、类说明

从LinkedList这个类名我们就猜出,这个List内部可能是由【链表】来实现,我们后面来验证一下。

public class LinkedList<E> extends AbstractSequentialList<E> implements List<E>, Deque<E>, Cloneable, Serializable {
    transient int size;
    //指向first节点
    transient LinkedList.Node<E> first;
    //指向last节点
    transient LinkedList.Node<E> last;
}

它实现了Deque接口,可以知道,LinkedList也可以作为【队列】来进行使用。

同时也实现了Serializable接口,说明可以对它进行序列化,反序列化来传递,获取数据等

LinkedList的成员变量:

  int size表明:List有多少个元素

  Node类型的first变量:指向头节点的变量 (用C,C++解释称之为指针)

  Node类型的last变量:指向最后节点的变量

Node类源码:

private static class Node<E> {
    E item;
    LinkedList.Node<E> next;
    LinkedList.Node<E> prev;

    Node(LinkedList.Node<E> var1, E var2, LinkedList.Node<E> var3) {
        this.item = var2;
        this.next = var3;
        this.prev = var1;
    }
}

这是一个LinkedList的内部类,

一个泛型的item变量,用来存储数据

next:指向下一个节点的next指针

prev:指向前一个节点的prev指针

至此我们其实就可以得出结论,LinkedList内部就是由【链表】的形式实现。

它并没有用数组来存储数据元素,而是由一个个【Node类型的节点】来存储数据,然后每个Node节点通过指向前后节点的next和prev指针将整个List串联起来。

通过简单图来看看ArrayList和LinkedList的基本区别:

正是这样的区别,从而导致了两者不同的效率问题:

    如果对一个ArrayList频繁的增加数据,那么内部的数组就会不断扩容创建新的数组,然后把旧的数据复制到新数组返回。

    插入数据或者删除其中一个数据,又要把所有数据后移或者前移。

    这样的操作效率很低下,为了一个数据处理了其他数据。

   LinkedList不同,插入只需要将要插入位置的前节点的next指针指向新的数据节点(如下图插入工作的2),将插入节点的prev指向前节点(如1处),将next指向下一个节点(如3处),将之前的后节点的prev指针指向插入的新节点(如4处)。

  

                     

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值