LinkedList深入学习

  • 实现方法

首先LinkedList继承了AbstractSequentialList实现了List<E>, Deque<E>, Cloneable, java.io.Serializable接口

LinkedList是一种常用的list实现,他是基于双向链表(双向链表:集合中的每一个元素都知道其前一个元素和后一个元素的位置)来实现的,在LinkedList中,用一个内部的Entity类来代表集合中的元素,元素的值赋给element属性,Entity中的next属性指向元素的后一个元素,Entity中的previous属性指向元素的前一个元素,基于这样的机制能够实现快速的移动集合中的元素。

  • 构造方法

在创建LinkedList对象时候,首先创建一个element为null,next为null,previous为null的entity对象,并赋值给全局的header属性

在执行构造器的时候,LinkedList将head的next及previous都指向header,以形成双向链表所需要的闭环

  • 插入对象:add(E)

每次通过add方法增加元素的时候,要做的就是创建一个Entity对象,并将这个Entity的next指向header,previous指向head.previous,在完成自己的next、previuos的设置后,同时将位于当前元素的后一元素的previous指向自己,并将位于当前元素的前一元素的next指向自己,这样就保持了双向链表的闭环。

LinkedList的add方法不像ArrayList那样,要考虑扩容以及复制数组的问题,但是每增加一个元素,都会创建一个新的Entity对象,并修改相邻的两个元素的属性

  • 删除对象:remove(E)

要删除LinkedList中的一个元素,首先同样遍历整个集合中的元素,遍历和寻找元素的方法和ArrayList基本相同,寻找到之后删除就比ArrayList简单多了。

删除的时候,值需要直接删除链表上的当前元素,并将当前元素中的element、previous、next设置为空,并不需要移动元素的位置

  • 获取单个对象:get(index)

LinkedList的元素不是存储在数组中的,所以他的get操作过程比ArrayList复杂,在执行get操作时,首先判断传入的index值是否小于0或大于等于当前LinkedList的size值,,不符合则抛出越界异常;如符合条件,判断当前获取的位置是否小于LinkedList值的一般,如果小于,则从头一直找到index位置对应的元素,大于则从尾部往前查找

  • 遍历对象:iterator()

Iterator方法由父类的AbsttractList实现,当调用此方法的时候,每次都会创建一个ListItr对象,创建时候该对象符合保存cursor位置

  • 判断对象是否存在:contains(E)

为了判断元素是否存在与集合中,采用的方法是遍历所有元素,如果传入的值为null,则找到为null的元素,传入值为非null,则使用equals进行判断,找到则返回true

  • 注意要点

    • LinkedList是基于双向链表的机制实现的
    • LinkedList是非线程安全的
    • LinkedList执行插入元素的时候,会创建一个Entity对象,并切换相应元素的前后元素的引用,在查找元素的时候,进行遍历链表,删除元素的时候,遍历链表找到删除的元素
时间: 2024-10-13 05:09:41

LinkedList深入学习的相关文章

java学习笔记--类ArrayList和LinkedList的实现

在集合Collection下的List中有两个实现使用的很频繁,一个是ArrayList,另一个是LinkedList,在学习中肯定都会有这样的疑问:什么时候适合使用ArrayList,什么时候用LinkedList?这时,我们就需要了解ArrayList和LinkedList的底层的实现,下面,为了更好的了解它们具体是怎样实现的,我们来写自己的ArrayList 和LinkedList. ArrayList底层是基于数组实现的,数组在内存中是存储在连续的存储单元中,在数据查找的时候比较快,适用

JDK源码学习LinkedList

LinkedList是List接口的子类,它底层数据结构是双向循环链表.LinkedList还实现了Deque接口(double-end-queue双端队列,线性collection,支持在两端插入和移除元素).所以LinkedList既可以被当作双向链表,还可以当做栈.队列或双端队列进行操作.文章目录如下: 1.LinkedList的存储实现(jdk 1.7.0_51) 2.LinkedList的读取实现 3.LinkedList的性能分析 下面我们进入正题,开始学习LinkedList. L

Java集合源码学习笔记(三)LinkedList分析

前面学习了ArrayList的源码,数组是顺序存储结构,存储区间是连续的,占用内存严重,故空间复杂的很大.但数组的二分查找时间复杂度小,为O(1),数组的特点是寻址容易,插入和删除困难.今天学习另外的一种常用数据结构LinkedList的实现,LinkedList使用链表作为存储结构,链表是线性存储结构,在内存上不是连续的一段空间,占用内存比较宽松,故空间复杂度很小,但时间复杂度很大,达O(N),链表的特点是寻址困难,插入和删除容易.所有的代码都基于JDK 1.6. >>关于LinkedLis

API源码学习之集合(2)--LinkedList

继续集合源码学习--LinkedList 1.该类主要成员变量及构造方法有如下几个: 1 transient int size = 0; 2 3 /** 4 * Pointer to first node. 5 * Invariant: (first == null && last == null) || 6 * (first.prev == null && first.item != null) 7 */ 8 transient Node<E> first;

基于JDK1.8的LinkedList源码学习笔记

LinkedList作为一种常用的List,是除了ArrayList之外最有用的List.其同样实现了List接口,但是除此之外它同样实现了Deque接口,而Deque是一个双端队列接口,其继承自Queue,所以LinkedList同样可以用来模拟队列,栈以及双端队列. 一.基本用法 因为LinkedList是基于链表实现的,所以注定其插入和删除操作速度要快于ArrayList,但是由于其是链表结构,所以其随机访问查找检索速度慢于基于数组的ArrayList. 这里先主要说一下LinkedLis

[Java] LinkedList / Queue - 源代码学习笔记

简单地画了下 LinkedList 的继承关系,如下图.只是画了关注的部分,并不是完整的关系图.本博文涉及的是 Queue, Deque, LinkedList 的源代码阅读笔记.关于 List 接口的笔记,可以参考上一篇博文 List / ArrayList - 源代码学习笔记 Queue 1. 继承 Collection 接口,并提供了额外的插入.提取和查看元素的方法.新增的方法都有两种形式:当操作失败时,抛出异常或者返回一个特殊值.特殊值可以是 null 或者 false ,这取决于方法本

List接口实现类-ArrayList、Vector、LinkedList集合深入学习以及源码解析

学习List接口实现类 ArrayList  Vector  LinkedList List接口的实现类中最常用最重要的就是这三个:ArrayList.Vector.LinkedList. JDK中这三个类的定义: public class ArrayList<E> extends AbstractList<E> implements List<E>, RandomAccess, Cloneable, java.io.Serializable { <span st

JDK学习---深入理解java中的LinkedList

本文参考资料: 1.<大话数据结构> 2.http://blog.csdn.net/jzhf2012/article/details/8540543 3.http://blog.csdn.net/jzhf2012/article/details/8540410 4.http://www.cnblogs.com/ITtangtang/p/3948610.html 5.http://blog.csdn.net/zw0283/article/details/51132161 本来在分析完HashSe

ArrayList和LinkedList学习

摘要 ArrayList和LinkedList是对List接口的不同数据结构的实现.它们都是线程不安全的,线程不安全往往出现在数组的扩容.数据添加的时候. 一.ArrayList和LinkedList是什么? ArrayList:ArrayList是List接口的可变数组的实现. LinkedList:LinkedList是List接口的(双向)链表实现. 二.两个List的数据结构 1.ArrayList的数据结构 ArrayList的类继承图如下: (1-1:ArrayList的类继承图)