浅谈LinkedList

LinkedList简介

LinkedList 是一个继承于AbstractSequentialList的双向链表。它也可以被当作堆栈、队列或双端队列进行操作。 

LinkedList 实现 List 接口,能对它进行队列操作。

LinkedList 实现 Deque 接口,即能将LinkedList当作双端队列使用。

LinkedList 实现了Cloneable接口,即覆盖了函数clone(),能克隆。

LinkedList 实现java.io.Serializable接口,这意味着LinkedList支持序列化,能通过序列化去传输。

LinkedList 是非同步的。

LinkedList相对于ArrayList来说,是可以快速添加,删除元素,ArrayList添加删除元素的话需移动数组元素,可能还需要考虑到扩容数组长度。

LinkedList继承体系

 

 

LinkedList源码分析

属性

 

LinkedList本身的属性比较少,主要有三个,一个是size,表名当前有多少个节点;一个是first代表第一个节点;一个是last代表最后一个节点。

 

构造方法

  • 无参构造

默认构造方法是空的,什么都没做,表示初始化的时候size为0,first和last的节点都为空:

  • 带Collection集合的构造

执行逻辑:

1、使用this()调用默认的无参构造函数。

2、调用addAll()方法,传入当前的节点个数size,此时size为0,并将collection对象传递进去

3、检查index有没有数组越界的嫌疑

4、将collection转换成数组对象a

5、循环遍历a数组,然后将a数组里面的元素创建成拥有前后连接的节点,然后一个个按照顺序连起来。

6、修改当前的节点个数size的值

7、操作次数modCount自增1.

源码如下:

addAll方法:

add方法

  • add(E e)方法

 

实际上就是调用在尾部添加元素的方法

 

 

 

 

 

 

 

 

  • add(int index,E element )方法

指定位置往数组链表中添加元素

1、检查添加的位置index 有没有小于等于当前的长度链表size,并且要求大于0

2、如果是index是等于size,那么直接往链表的最后面添加元素,相当于调用add(E e)方法

3、如果index不等于size,则先是索引到处于index位置的元素,然后在index的位置前面添加新增的元素。

get方法

 

  • getFirst方法

返回第一个节点元素

  • getLast方法

返回最后一个结点元素

remove方法

  • remove()方法

remove()方法本质是调用removeFirst方法,删除第一个结点

  • remove(int index)方法

删除指定位置的结点。先是检查移除的位置是否在链表长度的范围内,如果不在则抛出异常,根据索引index获取需要移除的节点,将移除的节点置空,让其上一个节点和下一个节点对接起来。

 

unlink方法:

 

  • remove(Object o)方法

删除链表中的指定结点

 

  • removeFirst()方法

移除链表中的第一个结点。将第一个节点置空,让下一个节点变成第一个节点,链表长度减1,修改次数加1,返回移除的第一个节点。

 

  • removeLast()方法

移除最后一个节点,将最后一个节点置空,最后一个节点的上一个节点变成last节点,,链表长度减1,修改次数加1,返回移除的最后一个节点。

 

set方法

set方法不修改modCount值。

clear方法

将所有链表元素置空,然后将链表长度修改成0,修改次数加1

toArray方法

创建一个Object的数组对象,然后将所有的节点都添加到Object对象中,返回Object数组对象。

listIterator方法

这个方法返回的是一个内部类ListIterator,用户可以使用这个内部类变量当前的链表元素,但是由于LinkedList也是非线程安全的类,所以和ArrayList中的 Iterator一样,多线程下面使用,也可能会产生多线程修改的异常。

 

小结

LinkedList 是双向列表。

  • 链表批量增加,是靠for循环遍历原数组,依次执行插入节点操作。对比ArrayList是通过System.arraycopy完成批量增加的。增加一定会修改modCount。
  • 通过下标获取某个node 的时候,(add select),会根据index处于前半段还是后半段 进行一个折半,以提升查询效率
  • 删也一定会修改modCount。 按下标删,也是先根据index找到Node,然后去链表上unlink掉这个Node。 按元素删,会先去遍历链表寻找是否有该Node,如果有,去链表上unlink掉这个Node。
  • 改也是先根据index找到Node,然后替换值。改不修改modCount。
  • 查本身就是根据index找到Node。
  • 所以它的CRUD操作里,都涉及到根据index去找到Node的操作。

 

 

 

 

 

 

 

 

 

 

全部评论

相关推荐

机械打工仔:有说的你怀疑一下就行了,直接问也太实诚了
点赞 评论 收藏
分享
避坑恶心到我了大家好,今天我想跟大家聊聊我在成都千子成智能科技有限公司(以下简称千子成)的求职经历,希望能给大家一些参考。千子成的母公司是“同创主悦”,主要经营各种产品,比如菜刀、POS机、电话卡等等。听起来是不是有点像地推销售公司?没错,就是那种类型的公司。我当时刚毕业,急需一份临时工作,所以在BOSS上看到了千子成的招聘信息。他们承诺无责底薪5000元,还包住宿,这吸引了我。面试的时候,HR也说了同样的话,感觉挺靠谱的。于是,我满怀期待地等待结果。结果出来后,我通过了面试,第二天就收到了试岗通知。试岗的内容就是地推销售,公司划定一个区域,然后你就得见人就问,问店铺、问路人,一直问到他们有意向为止。如果他们有兴趣,你就得摇同事帮忙推动,促进成交。说说一天的工作安排吧。工作时间是从早上8:30到晚上18:30。早上7点有人叫你起床,收拾后去公司,然后唱歌跳舞(销售公司都这样),7:55早课(类似宣誓),8:05同事间联系销售话术,8:15分享销售技巧,8:30经理训话。9:20左右从公司下市场,公交、地铁、自行车自费。到了市场大概10点左右,开始地推工作。中午吃饭时间大约是12:00,公司附近的路边盖饭面馆店自费AA,吃饭时间大约40分钟左右。吃完饭后继续地推工作,没有所谓的固定中午午休时间。下午6点下班后返回公司,不能直接下班,需要与同事交流话术,经理讲话洗脑。正常情况下9点下班。整个上班的一天中,早上到公司就是站着的,到晚上下班前都是站着。每天步数2万步以上。公司员工没有自己的工位,百来号人挤在一个20平方米的空间里听经理洗脑。白天就在市场上奔波,公司的投入成本几乎只有租金和工资,没有中央空调。早上2小时,晚上加班2小时,纯蒸桑拿。没有任何福利,节假日也没有3倍工资之类的。偶尔会有冲的酸梅汤和西瓜什么的。公司的晋升路径也很有意思:新人—组长—领队—主管—副经理—经理。要求是业绩和团队人数,类似传销模式,把人留下来。新人不能加微信、不能吐槽公司、不能有负面情绪、不能谈恋爱、不能说累。在公司没有任何坐的地方,不能依墙而坐。早上吃早饭在公司外面的安全通道,未到上班时间还会让你吃快些不能磨蹭。总之就是想榨干你。复试的时候,带你的师傅会给你营造一个钱多事少离家近的工作氛围,吹嘘工资有多高、还能吹自己毕业于好大学。然后让你早点来公司、无偿加班、抓住你可能不会走的心思进一步压榨你。总之,大家在找工作的时候一定要擦亮眼睛,避免踩坑!———来自网友
qq乃乃好喝到咩噗茶:不要做没有专业门槛的工作
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
07-10 13:54
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务