热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

linkedto什么意思,linkedlist特点

LinkedList是Collection下的一个list实现,就像ArrayList一样。和ArrayList不同的是它是链表结构,而ArrayList是顺序结构。我们平常使用的


链接列表是Collection下的列表实现,类似于ArrayList。 与ArrayList不同,它是链表结构,ArrayList是顺序结构。 我们平时使用的list是一样的,理论上一种list可以满足所有的需求。 但是,它们在执行过程中存在差异,达到需求所需的资源也不同。 关于在什么情况下使用哪个list,让我们来看看需求和当前情况。


视频:


链接列表由AbstractSequentialList继承的双向链表


链接列表可以作为堆栈、队列或双端队列进行操作。


因为链接列表实现了列表接口,所以队列操作


链接列表实现了Deque接口,可以将链接列表用作双端队列


LinkedList实现了Cloneable接口,可以覆盖函数clone(),进行克隆。


由于链接列表提供了java.io.Serializable接口,因此可以通过串行化传输链接列表http://www.Sina.com /。


链接列表是异步的。


支持序列化


//创建一个LinkedList来保护缺省构造函数LinkedList () Collection中的所有元素。 链接列表(collection? 扩展会话(http://www.Sina.com /


链接的列表由AbstractSequentialList继承,并实现了Dequeue接口。 “链接的列表”包含两个重要成员:头和大小。


header是双向链表的标题,是与双向链表节点对应的类Entry的实例。 Entry包含名为previous、next和element的成员变量。 其中,previous是该节点的上一个节点,next是该节点的下一个节点,element是该节点包含的值。


size是双向链表中的节点数。 ##双向链表结构


链表:链表是一种重要的数据结构,有单链表和双链表分单链表。


单链表(单向链表)由两部分组成:数据域(Data )和节点域(Node )。 单链表就像一条结很多的绳子,每个结相当于一个节点,每个节点之间都有一条绳子相连。 这种原理的实现是通过节点节点区域的头部指针head实现的,每个节点都有一个指针,每个节点指针的方向都指向自己,最后一个节点的head点为null,这样就像前面提到的绳索一样链如果需要查找链表中的任何节点,则必须从一开始就进行遍历。


双向链表结构


双链表(双向链表)双链表比单链表多尾指针(tail ),双链表的每个节点都有头指针head和尾指针tail。 双链表比单链表更容易操作,双链表节点第一个节点的head指向null,tail指向下一个节点的tail。 末尾节点的head指向上一个节点的head,tail指向null,是双向关系;


如果需要在单链表中搜索元素,则必须从第一个元素开始搜索。 双向链表在每个节点上包含两个指针,第一个节点和最后一个节点除外。 此指针指向上一个节点的地址和下一个节点的地址,以便还可以通过该节点搜索其他节点。


插入删除不需要移动元素。 您也可以立即插入删除、在结构前后插入数据,或双向遍历###链表


AbstractSequentialList链接列表是AbstractSequentialList的子类


AbstractSequentialList是get (索引)、set (索引、E element )、add (索引、E element )、remove (索引) ) 既然所有这些接口都是随机访问列表的,且链接列表已由双向链表AbstractSequentialList继承,那么名为“get (索引)”的接口就已经实现


另外,如果需要使用AbstractSequentialList实现自己的列表,则可以扩展该类并提供listIterator (和size )方法的实现。 要实现不可修改的列表,需要实现列表迭代器的hasNext、next、hasPrevious、previous和索引方法。


链接列表继承关系:


Java.lang.object Java.util.abstractcollectionejava.util.abstractlistejava.uti

l.AbstractSequentialList ↳ java.util.LinkedList public class LinkedList extends AbstractSequentialList implements List, Deque, Cloneable, java.io.Serializable { …… }

LinkedList与Collection关系

Collection:

Collection是最基本的集合接口,一个Collection代表一组Object,即Collection的元素(Elements)。一些Collection允许相同的元素而另一些不行。一些能排序而另一些不行。Java SDK不提供直接继承自Collection的类,Java SDK提供的类都是继承自Collection的“子接口”如List和Set。

LinkedList的本质是双链表,实现 List 和 Deque接口:

在LinkedList中,每个节点都用内部类Node表示:

具体的过程可以看下面这张图:
点我

每个node都是节点,里面有三个属性,分别指向上一个节点、下一个节点、实际储存元素开辟的内存空间

而对linkedlist里元素的操作方法都是对这些节点进行操作:

add()操作:

/** * Appends the specified element to the end of this list. * *

This method is equivalent to {@link #addLast}. * * @param e element to be appended to this list * @return {@code true} (as specified by {@link Collection#add}) */ public boolean add(E e) { linkLast(e); return true; } /** * Links e as last element. */ void linkLast(E e) { final Node l = last; final Node newNode = new Node<>(l, e, null); last = newNode; if (l == null) first = newNode; else l.next = newNode; size++; modCount++; }

remove()操作

/** * Removes the element at the specified position in this list. Shifts any * subsequent elements to the left (subtracts one from their indices). * Returns the element that was removed from the list. * * @param index the index of the element to be removed * @return the element previously at the specified position * @throws IndexOutOfBoundsException {@inheritDoc} */ public E remove(int index) { checkElementIndex(index); return unlink(node(index)); }//查找对应索引 private void checkElementIndex(int index) { if (!isElementIndex(index)) throw new IndexOutOfBoundsException(outOfBoundsMsg(index)); } /** * Unlinks non-null node x. */ E unlink(Node x) { // assert x != null; final E element = x.item; final Node next = x.next; final Node prev = x.prev; if (prev == null) { first = next; } else { prev.next = next; x.prev = null; } if (next == null) { last = prev; } else { next.prev = prev; x.next = null; } x.item = null; size--; modCount++; return element; }

可以看到都是对node节点进行操作,真实的实例内存并没有任何改变,等着jvm回收。

List使用场景

ArrayList在随机访问方面比较擅长,LinkedList在随机增删方面比较擅长
对于需要快速插入,删除元素,使用LinkedList。因为ArrayList要想在数组中任意两个元素中间添加对象时,数组需要移动所有后面的对象。
对于需要快速随机访问元素(get()),应该使用ArrayList,因为LinkedList要移动指针、遍历节点来定位,所以速度慢。
对于“单线程环境” 或者 “多线程环境,但List仅仅只会被单个线程操作”,此时应该使用非同步的类(如ArrayList)。
对于“多线程环境,且List可能同时被多个线程操作”,此时,应该使用同步的类(如Vector)。

对于插入数据使用时间的对比:

public static void addTest(){ //批量插入,每次都向首位插入数据; LinkedList linkedList = new LinkedList(); long time1 = new Date().getTime(); for(int m=0;m<300000;m++){ linkedList.add(0,null); } long time2 = new Date().getTime(); System.out.print("linkedList批量插入时间:"+(time2 - time1)+"ms\n"); ArrayList arraylist = new ArrayList(); long time3 = new Date().getTime(); for(int n=0;n<300000;n++){ arraylist.add(0, null); } long time4 = new Date().getTime(); System.out.print("arrayList批量插入时间:"+(time4 - time3)+"ms\n"); }

结果:

linkedList批量插入时间:9ms
arrayList批量插入时间:3696ms

那么问题就来了:

Q:什么时候使用Arraylist,什么时候使用LinkedList?
A:zjdmn需要频繁查询数组的时候使用ArrayList比较快,zjdmn需要频繁操作数组进行增删插入操作的时候使用LinkList比较合适。当然直接在末尾添加数据ArrayList用时也不是特别多,因为在末尾操作后面没有数据。

Q:那什么时候适合用list呢
A:涉及到“栈”、“队列”、“链表”等操作,应该考虑用List,具体的选择哪个List,根据下面的标准来取舍

对于需要快速插入,删除元素,应该使用LinkedList。对于需要快速随机访问元素,应该使用ArrayList。对于“单线程环境” 或者 “多线程环境,但List仅仅只会被单个线程操作”,此时应该使用非同步的类(如ArrayList)。对于“多线程环境,且List可能同时被多个线程操作”,此时,应该使用同步的类(如Vector)。

Q:线程安全的数组,什么是线程安全?
A:线程安全就是当前资源只能被单独一个线程访问,也就是加同步锁的线程。默认的线程安全的list是Vector;

以上,如果有哪里不对或者不清楚的地方欢迎勾搭,多谢指正


推荐阅读
  • 深入理解Kafka服务端请求队列中请求的处理
    本文深入分析了Kafka服务端请求队列中请求的处理过程,详细介绍了请求的封装和放入请求队列的过程,以及处理请求的线程池的创建和容量设置。通过场景分析、图示说明和源码分析,帮助读者更好地理解Kafka服务端的工作原理。 ... [详细]
  • 深入解析Linux下的I/O多路转接epoll技术
    本文深入解析了Linux下的I/O多路转接epoll技术,介绍了select和poll函数的问题,以及epoll函数的设计和优点。同时讲解了epoll函数的使用方法,包括epoll_create和epoll_ctl两个系统调用。 ... [详细]
  • linux进阶50——无锁CAS
    1.概念比较并交换(compareandswap,CAS),是原⼦操作的⼀种,可⽤于在多线程编程中实现不被打断的数据交换操作࿰ ... [详细]
  • 广度优先遍历(BFS)算法的概述、代码实现和应用
    本文介绍了广度优先遍历(BFS)算法的概述、邻接矩阵和邻接表的代码实现,并讨论了BFS在求解最短路径或最短步数问题上的应用。以LeetCode中的934.最短的桥为例,详细阐述了BFS的具体思路和代码实现。最后,推荐了一些相关的BFS算法题目供大家练习。 ... [详细]
  • 第七课主要内容:多进程多线程FIFO,LIFO,优先队列线程局部变量进程与线程的选择线程池异步IO概念及twisted案例股票数据抓取 ... [详细]
  • LeetCode笔记:剑指Offer 41. 数据流中的中位数(Java、堆、优先队列、知识点)
    本文介绍了LeetCode剑指Offer 41题的解题思路和代码实现,主要涉及了Java中的优先队列和堆排序的知识点。优先队列是Queue接口的实现,可以对其中的元素进行排序,采用小顶堆的方式进行排序。本文还介绍了Java中queue的offer、poll、add、remove、element、peek等方法的区别和用法。 ... [详细]
  • JVM 学习总结(三)——对象存活判定算法的两种实现
    本文介绍了垃圾收集器在回收堆内存前确定对象存活的两种算法:引用计数算法和可达性分析算法。引用计数算法通过计数器判定对象是否存活,虽然简单高效,但无法解决循环引用的问题;可达性分析算法通过判断对象是否可达来确定存活对象,是主流的Java虚拟机内存管理算法。 ... [详细]
  • 本文介绍了Python爬虫技术基础篇面向对象高级编程(中)中的多重继承概念。通过继承,子类可以扩展父类的功能。文章以动物类层次的设计为例,讨论了按照不同分类方式设计类层次的复杂性和多重继承的优势。最后给出了哺乳动物和鸟类的设计示例,以及能跑、能飞、宠物类和非宠物类的增加对类数量的影响。 ... [详细]
  • 纠正网上的错误:自定义一个类叫java.lang.System/String的方法
    本文纠正了网上关于自定义一个类叫java.lang.System/String的错误答案,并详细解释了为什么这种方法是错误的。作者指出,虽然双亲委托机制确实可以阻止自定义的System类被加载,但通过自定义一个特殊的类加载器,可以绕过双亲委托机制,达到自定义System类的目的。作者呼吁读者对网上的内容持怀疑态度,并带着问题来阅读文章。 ... [详细]
  • 重入锁(ReentrantLock)学习及实现原理
    本文介绍了重入锁(ReentrantLock)的学习及实现原理。在学习synchronized的基础上,重入锁提供了更多的灵活性和功能。文章详细介绍了重入锁的特性、使用方法和实现原理,并提供了类图和测试代码供读者参考。重入锁支持重入和公平与非公平两种实现方式,通过对比和分析,读者可以更好地理解和应用重入锁。 ... [详细]
  • 本文介绍了在Android开发中使用软引用和弱引用的应用。如果一个对象只具有软引用,那么只有在内存不够的情况下才会被回收,可以用来实现内存敏感的高速缓存;而如果一个对象只具有弱引用,不管内存是否足够,都会被垃圾回收器回收。软引用和弱引用还可以与引用队列联合使用,当被引用的对象被回收时,会将引用加入到关联的引用队列中。软引用和弱引用的根本区别在于生命周期的长短,弱引用的对象可能随时被回收,而软引用的对象只有在内存不够时才会被回收。 ... [详细]
  • STL迭代器的种类及其功能介绍
    本文介绍了标准模板库(STL)定义的五种迭代器的种类和功能。通过图表展示了这几种迭代器之间的关系,并详细描述了各个迭代器的功能和使用方法。其中,输入迭代器用于从容器中读取元素,输出迭代器用于向容器中写入元素,正向迭代器是输入迭代器和输出迭代器的组合。本文的目的是帮助读者更好地理解STL迭代器的使用方法和特点。 ... [详细]
  • 本文介绍了如何通过维持两个堆来获取一个数据流中的中位数。通过使用最大堆和最小堆,分别保存数据流中较小的一半和较大的一半数值,可以保证两个堆的大小差距为1或0。如果数据流中的数量为奇数,则中位数为较大堆的最大值;如果数量为偶数,则中位数为较大堆的最大值和较小堆的最小值的平均值。可以使用优先队列来实现堆的功能。本文还提供了相应的Java代码实现。 ... [详细]
  • C++ STL复习(13)容器适配器
    STL提供了3种容器适配器,分别为stack栈适配器、queue队列适配器以及priority_queue优先权队列适配器。不同场景下,由于不同的序列式 ... [详细]
  • 本文讨论了Kotlin中扩展函数的一些惯用用法以及其合理性。作者认为在某些情况下,定义扩展函数没有意义,但官方的编码约定支持这种方式。文章还介绍了在类之外定义扩展函数的具体用法,并讨论了避免使用扩展函数的边缘情况。作者提出了对于扩展函数的合理性的质疑,并给出了自己的反驳。最后,文章强调了在编写Kotlin代码时可以自由地使用扩展函数的重要性。 ... [详细]
author-avatar
峡谷人123_742
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有