首页
学习
活动
专区
圈层
工具
发布

JDK8中LinkedList的工作原理剖析

实现了Deque接口可以有双端队列操作 实现了Cloneable接口既可以用来做浅克隆 实现了Serializable接口可以用来做网络传输和持久化,同时可以使用序列化来做深度克隆。...从上面的源码里可以看到移除根据index移除里面调用了node(index)方法来查找需要移除的节点,而根据Object移除的时候,则是进行了整个链表的遍历,然后再卸载节点。...这里能够总结出来链表基于首尾节点的删除可以看成是O(1)操作,而非首尾的删除最坏的情况下能够达到O(n)操作,因为要遍历查询指定节点,所以性能较差。...(九)关于操作队列或者堆栈的方法 文章开头说了LinkedList可以当双端队列或者堆栈使用,这里面有一系列的方法,这里只简单列举几个常用的方法,因为原理比较简单所以不在叙述: ?...更加节省空间, 此外它的添加方法和首末位的删除操作非常快,但是查询和遍历操作比较耗时。

831120
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    关于优雅地实现LRU缓存这件事,一次性说清楚

    但是我们知道缓存的大小通常是有限制的。当缓存满了,我们就需要删除部分数据来腾出空间,问题在于我们基于什么标准来删除数据。...有没有办法让数据放进来的时候就排好序? 每次我们通过get访问一个缓存的元素,只要它存在于缓存中,那它肯定就变成最近最多使用(most recently used)的元素了,要被提取到数组的最前面。...对于单链表,找到它后面的节点很方便,要找到它前面的节点就得再次遍历链表了,这个时间复杂度太大了,所以我们使用一个额外的字段来记录它前一个节点,也就是双链表。...还用上面的例子来说明,我这边用双链表来记录最近被访问的元素,维护删除节点的先后顺序,链表的head是最近最多使用的元素,而tail则是最近最少使用的元素,实际上反过来也没什么问题,大家自己实现时按自己喜好来就好...,拿到一个节点时,我们可以快速从哈希表中移除元素,否则我们得遍历整个哈希表来匹配了。

    66710

    Java|Map、List与Set的区别

    有的人想有没有不重复的数组,所以有了set。 有人想有自动排序的组数,所以有了TreeSet、TreeList、Tree**。 而几乎所有的集合都是基于数组来实现的。...LinkedHashSet:具有HashSet的查询速度,且内部使用链表维护元素的顺序(插入的次序)。于是在使用迭代器遍历Set时,结果会按元素插入的次序显示。...对于List的随机访问来说,就是只随机来检索位于特定位置的元素。 List 的 get(int index) 方法放回集合中由参数index指定的索引位置的对象,下标从“0” 开始。...LinkedHashMap:类似于HashMap,但是迭代遍历它时,取得“键值对”的顺序是其插入次序,或者是最近最少使用(LRU)的次序。只比HashMap慢一点。...注意: 1、Collection没有get()方法来取得某个元素。只能通过iterator()遍历元素。 2、Set和Collection拥有一模一样的接口。

    3.3K130

    【Java 基础篇】Java LinkedList 详解:数据结构的灵活伙伴

    遍历 LinkedList 遍历 LinkedList 可以使用不同的方式,最常见的是使用 for-each 循环或迭代器。...linkedList.add(2, "葡萄"); // 在索引 2 处插入 "葡萄" 5.3 替换元素 您可以使用 set 方法来替换 LinkedList 中的元素。...6.2 时间复杂度 添加和删除元素:平均时间复杂度为 O(1)(在已知位置的情况下),最坏情况下为 O(n)(如果需要遍历整个链表)。...高级用法 8.1 双向链表 LinkedList 是一种双向链表的实现,这意味着每个节点都包含指向前一个节点和后一个节点的引用。这种双向连接使得在链表中向前和向后遍历都非常高效。...根据您的需求,您可以充分利用其双向链表的特性来解决问题。 9.

    1.8K60

    Java基础之泛型程序设计

    泛型程序设计 简要介绍 类型变量使用大写形式,且比较短,在Java库中,使用变量E表示集合的元素类型,K和V分别表示表的关键字与值得类型。...Object 表示”任意类型” 程序清单使用了Pair类,静态的minmax方法遍历了数组并同时计算出最大值和最小值。它用一个Pair对象返回了两个结果。...与Java泛型转换的事实 虚拟机中没有泛型,只有普通的类和方法。 所有的类型参数都用它们的限定类型替换 桥方法被合成来保持多态 为保持类型安全性,必要时插入强制类型转换。...可以采取两种方法来抑制这个警告。一种方法是为包含addAll调用的方法增加注解@SuppressWarnings(“unchecked”)。...可以通过 `@SuppressWarnings('unchecked')` 来消除对受查异常的检查。 ### 泛型类型的继承规则 1.

    37520

    LinkedList源码解析

    其中getFirst() 和element() 方法将会在链表为空时,抛出异常 element()方法的内部就是使用getFirst()实现的。...ArrayList的遍历效率会比LinkedList的遍历效率高一些。 LinkedList做插入、删除的时候,慢在寻址,快在只需要改变前后Node的引用地址。...ArrayList做插入、删除的时候,慢在数组元素的批量copy,快在寻址。 如果确定插入、删除的元素是在前半段,那么就使用LinkedList。...如果确定插入、删除的元素在比较靠后的位置,那么可以考虑使用ArrayList。 如果不能确定插入、删除是在哪儿呢?...建议使用LinkedList,一来LinkedList整体插入、删除的执行效率比较稳定,没有ArrayList这种越往后越快的情况。

    1.1K41

    双端队列 【Deque】

    参考链接 JAVA 栈,为什么要使用Deque,而不推荐使用Stack,Deque中ArrayDeque与LinkedList的区别,Deque方法详解_java 栈为什么用deque-CSDN博客 简介...可以理解成,双端队列就是可以在队头 和 队尾进行操作,比如:查看队头队尾元素,弹出队头队尾元素,或者从队头和队尾插入元素,那也就意味着他可以用来当做 队列 和 栈 的数据结构使用 用法 队列 先进先出的线性数据结构...查看队头元素 方法 作用 E getFirst()/E element()/E pop() 只看第一个元素 ,不出来,为空就抛异常 E peekFirst()/ E peek() 只看第一个元素 ,不出来...push(E e) 将指定的元素插入此双端队列的前面 ,空间不足抛异常 出栈 方法 作用 E removeFirst()/E remove()/E pop() 检索并删除第一个元素,为空时抛出异常 E...pollFirst()/ E poll() 检索并删除第一个元素 ,为空时返回null 查看栈顶元素 方法 作用 E getFirst()/E element()/E pop() 只看第一个元素 ,

    20310

    java中Map,List与Set的区别

    三:数组是一种可读/可写数据结构---没有办法创建一个只读数组。然而可以使用集合提供的ReadOnly方法,以只读方式来使用集合。该方法将返回一个集合的只读版本。...对于List的随机访问来说,就是只随机来检索位于特定位置的元素。 List 的 get(int index) 方法放回集合中由参数index指定的索引位置的对象,下标从“0” 开始。...LinkedHashMap: 类似于HashMap,但是迭代遍历它时,取得“键值对”的顺序是其插入次序,或者是最近最少使用(LRU)的次序。只比HashMap慢一点。...注意: 1、Collection没有get()方法来取得某个元素。只能通过iterator()遍历元素。 2、Set和Collection拥有一模一样的接口。...3、List,可以通过get()方法来一次取出一个元素。使用数字来选择一堆对象中的一个,get(0)...。(add/get) 4、一般使用ArrayList。

    2.1K20

    Java集合框架(二)-LinkedList

    ),插入和删除元素的效率高(遍历元素和随机访问元素的效率低); 底层使用Node双向链表实现的 private static class Node { E item; //元素值...= element; this.next = next; this.prev = prev; } } 3、LinkedList初始化 // LinkedList包含首尾操作的特有方法...addLast(E e) addLast(E e)添加到链表首部 4.4 getFirst() getFirst() 获取第一个元素 4.5 getLast() getLast() 获取最后一个元素...,依次向前移动指针,直到找到指定下标位置,返回对应元素; 所以:当下标位置越接近元素个数一半值(越靠近中间位置),效率是最低的,可以看出:遍历和随机访问的效率低; 源码 public E get(int...,存放元素没限制; 3)使用场景不同:ArrayList适用于快速的遍历和随机访问元素,而LinkedList适用于快速的添加删除元素;

    35210

    Java中LinkedList类的特性与用法详解

    源代码解析LinkedList类的源代码可以在Java SE标准库中找到,它主要由以下几部分组成:Node类:双向链表中的节点,包含前驱节点、后继节点以及当前节点的值。...方法的泛型参数 E 表示元素的类型,这里使用了泛型来支持不同类型的元素。getFirst()public E getFirst()  该方法用于返回列表中的第一个元素。...拓展:  这是一个泛型方法,返回类型为E,表示返回值类型不确定,由调用方法时传入的参数类型来决定。  方法名为getFirst,没有参数。  ...然后,使用 ListIterator 迭代器遍历列表并输出每个元素。  接下来,代码演示了如何在指定位置插入元素,使用 add() 方法并指定插入位置即可。...最后,演示了如何获取列表中的第一个和第二个元素,分别使用 getFirst() 和 get() 方法。  综上,该代码演示了 LinkedList 类的基本用法,包括添加、遍历、插入、删除和获取元素。

    74022

    Java集合深度解析之LinkedList

    LinkedList简介 LinkedList是基于双向循环链表(从源码中可以很容易看出)实现的,除了可以当做链表来操作外,它还可以当做栈、队列和双端队列来使用。...LinkedList同样是非线程安全的,只在单线程下适合使用。 LinkedList实现了Serializable接口,因此它支持序列化,能够通过序列化传输,实现了Cloneable接口,能被克隆。...无参构造方法直接建立一个仅包含head节点的空链表,包含Collection的构造方法,先调用无参构造方法建立一个空链表,而后将Collection中的数据加入到链表的尾部后面。...该方法返回双向链表中指定位置处的节点,而链表中是没有下标索引的,要指定位置出的元素,就要遍历该链表。 从源码的实现中,我们看到这里有一个加速动作。...源码中先将index与长度size的一半比较,如果indexsize/2,就只从位置size往前遍历到位置index处。这样可以减少一部分不必要的遍历,从而提高一定的效率(实际上效率还是很低)。

    1.4K50

    LinkedList源码分析(基于Java8)内部结构构造方法添加2检索3删除4迭代器5 例子6总结

    LinkedList是一个实现了List接口和Deque接口的双端链表 有关索引的操作可能从链表头开始遍历到链表尾部,也可能从尾部遍历到链表头部,这取决于看索引更靠近哪一端。...LinkedList不是线程安全的,如果想使LinkedList变成线程安全的,可以使用如下方式: List list=Collections.synchronizedList(new LinkedList...(); } 从代码可以看到,element()方法的内部就是使用getFirst()实现的。...按照位置删除 返回是否删除成功的标志 返回被删除的元素 按照对象删除 3.1 删除指定对象 remove(Object o) 一次只删除一个匹配的对象,如果删除了匹配对象,返回true,否则false...适用于频繁增加、删除的情况 该类不是线程安全的 由于LinkedList实现了Queue接口,所以LinkedList不止有队列的接口,还有栈的接口,可以使用LinkedList作为队列和栈的实现

    1.1K40

    【Java百炼成神】大魂师进阶篇——ArrayList、LinkedList、Vector、HashSet

    增强for循环 实际开发中,由于迭代器操作繁琐,所以最常使用的是 foreach 循环(又叫增强 for 循环)来完成元素的 获取,增强 for 循环是完成集合迭代的简化方式。...所以在使用增强 for 时,我们要尽量避免在遍历过程中为集合添加/删除数据, 解决方案:   普通 for: 遍历时,可以进行添加/删除操作。   ...增强 for: 仅仅做遍历,不会在遍历中 添加/删除 集合元素  练习:  集合中存储多个 Person(姓名、年龄、性别、描述)对象,将集合中年龄大于 80 岁的 Person 对象 删除。...)  但 LinkedList 中这两个索引操作的方法严禁使用,因为效率极低  ​  总结:   需要一次性保存大量数据,经常进行索引遍历数据,推荐使用 ArrayList   需要进行数据频繁的追加和删除...,极少使用索引遍历数据,推荐使用 LinkedList  练习:   1、公司新闻公告,需要频繁滚动新闻(添加新新闻,但每次只展示前 4 条新 闻)。

    44220

    JAVA零基础小白学习免费教程day13-Collection&数据结构

    如果我们遍历Collection集合,使用for循环是无法使用的。我们可以借Collection中的toArray方法转换成数组,来遍历集合!...这种方式也能实现,但总觉得不太舒服,这时,JDK提供了一个Iterator接口来专门用于遍历集合。...Iterator迭代器对象在遍历集合时,内部采用指针的方式来跟踪集合中的元素,为了让初学者能更好地理解迭代器的工作原理,接下来通过一个图例来演示Iterator对象迭代元素的过程: 在调用Iterator...通常只进行遍历元素,不要在遍历的过程中对集合元素进行增删操作。...//集合的另一种遍历方式(jdk8以上才能使用) con.forEach(System.out::println); } } 新for循环必须有被遍历的目标。

    33610

    Java集合框架

    一、集合: 集合是Java API所提供的一系列类的实例,可以用于动态存放多个对象 为什么要使用集合?数组的长度是固定的,存满了就不能存了。...HashSet一样,hashCode(),equals() 2、TreeMap:是根据键来排序的,保证键唯一的原理和TreeSet相同,依据 compareTo()或compare()的返回值是否为0,...> c) 从集合中删除所有指定集合包含的对象 (3)、void clear() 清空集合 3、判断方法 (1)、boolean contains(Object o)  判断是否集合中是否包含指定对象 (...next最后一次获取的对象,如果使用迭代器遍历集合,必须使用迭代器的remove方法删除元素 26 } 27 System.out.println("----------...next最后一次获取的对象,如果使用迭代器遍历集合,必须使用迭代器的remove方法删除元素 8 }

    2.2K90
    领券