插入有序可重复(三) -- LinkedList

一:概述

LinkedList底层采用双向链表的数据结构实现,自然第一反应就是它的随机访问需要遍历,但是结构修改操作效率更高,其实不管说出花来这都是LinkedList相较于ArrayList最大的差别。本文就针对LinkedList双向链表、结构修改、随机访问、Deque、迭代等几个方向深入探究一下这个集合

二:双向链表

在这里插入图片描述
简简单单普普通通的一个静态内部类搞定,通过维护一前prev、一后next对象引用形成链表,item属性记录节点值。还需要注意的就是First、Last这两个位于LinkedList类中的属性,作为链表的首尾节点

三:结构修改

提到结构修改,无可厚非就是元素的增加、删除从而导致链表节点的新增删除。新增从首尾节点新增与下标插入新增两方面分析
在这里插入图片描述
add()也就调用linkLast(),将新增节点添加到链表尾。涉及到的操作就是将last修改,并维护好之前last节点与当前last节点之间的关系即可
在这里插入图片描述
在这里插入图片描述
处理流程还是比较清晰的,在某个下标插入节点时首先通过遍历链表得到当前节点N后再修改N-1与新增节点、新增节点与N之间的关系即可。遍历操作虽然做了二分优化,也就是node()第一个判断size() >> 1,但是还是可以看出没有ArrayList随机访问来的强悍

四:随机访问

在这里插入图片描述
既然LinkedList实现了List接口,那么必然也会实现随机访问get(index i),从以上示例图可以清晰看到调用的就是前面介绍的node(),二分优化实现的遍历查找

五:Deque

在这里插入图片描述
LinkedList实现了双端队列接口Deque,所以其必然也实现了队列的代表方法offer(),poll()。队列特点就是先进先出,offer()将新增元素添加到链表尾、poll()获取链表头。但是注意调用的unlinkFirst(),从方法名字就可以看出会删除元素节点的咯
在这里插入图片描述
个人一直认为Deque这个接口是比较骚气的,不仅仅支持队列的FIFO,还支持栈的FILO。看看栈的代表方法push()、pop(),实现与队列相反就完事儿了,添加到链表头、弹出列表头

六:迭代

ArrayList中的迭代实现有两个内部类,分别是向前迭代的ListItr与向后迭代的Itr,向前迭代的ListItr继承了向后迭代的Itr内部类,同时也就具备了向后迭代的能力。但是在LinkedList中发现其实现与ArrayList并不一致
在这里插入图片描述
内部类ListItr直接实现接口ListIIterator,ListIterator接口继承接口Iterator。那么LinkedList中的内部类ListItr自身实现向前、向后的迭代
在这里插入图片描述
抽象类AbstractSequentialList,该类中提供方法iterator()。ListIterator接口继承Iterator,返回值限定为Iterator。用一手多态,直接屏蔽Iterator子接口ListIterator的向前相关API,完成单独向后迭代的获取操作

七:总结
  • 二分法优化了LinkedList的遍历操作,但是并不能从根本上改变其随机访问性能不如ArrayList
  • 结构修改因为双向链表通过修改引用地址维护实现,所以性能优秀
  • 迭代器实现与ArrayList不一致,通过多态实现向后迭代的获取
  • Deque接口的实现算是一个亮点,该接口支持FIFO、FILO的特点。即队列与栈的操作,可以查看下API注意哪些元素获取操作会删除掉其中的链表节点
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值