返回顶部
首页 > 资讯 > 前端开发 > JavaScript >从面试角度怎么分析LinkedList源码
  • 921
分享到

从面试角度怎么分析LinkedList源码

2024-04-02 19:04:59 921人浏览 独家记忆
摘要

本篇内容介绍了“从面试角度怎么分析LinkedList源码”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!注

本篇内容介绍了“从面试角度怎么分析LinkedList源码”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

注:本系列文章中用到的jdk版本均为java8

LinkedList类图如下:

从面试角度怎么分析LinkedList源码

LinkedList底层是由双向链表实现的。链表好比火车,每节车厢包含了车厢和连接下一节车厢的连接点。而双向链表的每个节点不仅有指向下一个节点的指针,还有指向上一个节点的指针。

在LinkedList源码中有一个node静态类,源码如下:

private static class Node<E> {     E item;     Node<E> next;     Node<E> prev;      Node(Node<E> prev, E element, Node<E> next) {         this.item = element;         this.next = next;         this.prev = prev;     } }

一个Node节点包含三个部分,分别是

  • item:数据

  • next:下一个节点的指针

  • prev:上一个节点的指针

LinkedList的主要变量如下:

// 集合中的元素数量 transient int size = 0;   transient Node<E> first;   transient Node<E> last;

一、添加元素

LinkedList支持在任意节点位置添加元素,不仅提供了集合常用的add()方法,还提供了addFirst()和addLast(),add()方法默认调用addLast()方法,也就是默认是往链表尾部插入元素的。

add()方法源码:

public boolean add(E e) {     linkLast(e);     return true; }

1.1 尾部插入元素

linkLast()源码如下:

void linkLast(E e) {     final Node<E> l = last;     final Node<E> newNode = new Node<>(l, e, null);     last = newNode;     if (l == null)         first = newNode;     else         l.next = newNode;     size++;     modCount++; }

我们来画张图演示一下如何给链表尾部插入元素:

假如链表中没有元素

对应源码中的if语句,如果没有元素则新增的这个节点为链表中唯一的一个元素,既是首节点,又是尾结点,前一个元素的指针和后一个元素的指针都是null。这里注意head节点不是第一个节点,head节点只是标识了这个链表的地址。

从面试角度怎么分析LinkedList源码

假如链表中有元素

对应源码中else语句。先将新增的元素当成Last节点,然后将原来的Last节点的next指向新节点。

else     l.next = newNode;

从面试角度怎么分析LinkedList源码

一图胜前言,画个图是不是什么都明白了。

1.2 头部插入元素

linkFirst()源码如下:

private void linkFirst(E e) {     final Node<E> f = first;     final Node<E> newNode = new Node<>(null, e, f);     first = newNode;     if (f == null)         last = newNode;     else         f.prev = newNode;     size++;     modCount++; }

还是根据上面的图来解读一下源码,先将第一个节点赋值给中间变量f,将新节点newNode赋值给first节点。如果链表没有元素,则Last节点和First节点都是新插入的节点newNode,否则,将原来的First节点的头指针指向新节点。

二、删除元素

LinkedList提供的删除方法有根据索引和元素删除,除此之外还提供删除第一个元素和最后一个元素的方法,这里我们只分析一下根据索引删除的方法。

public E remove(int index) {     checkElementIndex(index);     return unlink(node(index)); }

checkElementIndex(index)方法就是用来判断传输的索引值是否合法,不合法则抛出数组越界异常。重点来看一下unlink(node(index))方法是如何删除元素的。

node(index)方法源码:

node(index)方法就是根据索引获取该索引位置的节点

Node<E> node(int index) {     // assert isElementIndex(index);     // 如果指定下标 < 一半元素数量,则从首结点开始遍历     // 否则,从尾结点开始遍历     if (index < (size >> 1)) {         Node<E> x = first;         for (int i = 0; i < index; i++)             x = x.next;         return x;     } else {         Node<E> x = last;         for (int i = size - 1; i > index; i--)             x = x.prev;         return x;     } }

unlink(Nodex)源码如下:

E unlink(Node<E> x) {     // assert x != null;     final E element = x.item;     final Node<E> next = x.next;     final Node<E> 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; }

画张图分析一下删除是如何进行的:

从面试角度怎么分析LinkedList源码

  1. 鸿蒙官方战略合作共建——HarmonyOS技术社区

  2. 假设删除的是第一个元素:则它的prev==NULL,我们需要将他的后一个元素(图中的second)作为第一个元素

  3. 假设删除的是最后一个元素,则它的next==null,我们需要将他的前一个元素(图中的second)作为最后一个元素

  4. 如果是中间的任意元素,则需要将它的前一个元素的next指针指向它的后一个元素,同时将它的后一个元素的prev指针指向它的前一个元素。

“从面试角度怎么分析LinkedList源码”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注编程网网站,小编将为大家输出更多高质量的实用文章!

--结束END--

本文标题: 从面试角度怎么分析LinkedList源码

本文链接: https://lsjlt.com/news/84169.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 从面试角度怎么分析LinkedList源码
    本篇内容介绍了“从面试角度怎么分析LinkedList源码”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!注...
    99+
    2024-04-02
  • 从源码角度分析Android的消息机制
    目录前言ThreadLocal的工作原理Looper的工作原理Handler的工作原理总结参考资料前言 说到Android的消息机制,那么主要的就是指的Handler的运行机制。其...
    99+
    2024-04-02
  • Java源码角度分析HashMap用法
    —HashMap—优点:超级快速的查询速度,时间复杂度可以达到O(1)的数据结构非HashMap莫属。动态的可变长存储数据(相对于数组而言)。缺点:需要额外计算一次hash值,如果处理不当会占用额外的空间。—HashMap如何使用—平时我们...
    99+
    2023-05-30
  • Java从JDK源码角度对Object进行的示例分析
    小编给大家分享一下Java从JDK源码角度对Object进行的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!Object是所有类的父类,也就是说java中...
    99+
    2023-05-30
    java object
  • Java从源码角度解析SpringMVC执行流程
    SpringMVC执行流程在面试中经常会被问到,本篇文章通过源码的方式简单的了解一下SpringMVC执行流程。 先看流程 先看一下SpringMVC执行流程再看源码,有助理解: ⽤...
    99+
    2023-05-16
    Spring MVC SpringMVC执行流程
  • Android 2.3 拨号上网流程从源码角度进行分析
    通常,如果我们想使用SIM卡拨号上网功能,我们要在设置中进行简单的配置,步骤如下: 设置 -》无线和网络 -》移动网络 -》(已启用数据/数据漫游/接入点名称/仅使用2G网络/...
    99+
    2022-06-06
    源码 Android
  • 通过JDK源码角度分析Long类详解
    概况Java的Long类主要的作用就是对基本类型long进行封装,提供了一些处理long类型的方法,比如long到String类型的转换方法或String类型到long类型的转换方法,当然也包含与其他类型之间的转换方法。除此之外还有一些位相...
    99+
    2023-05-30
    jdk源码 long类 j
  • 带你从编码角度分析C++重载原理
    目录什么是函数重载代码分析总结什么是函数重载 函数重载的即是在相同作用域中的多个函数,它们具有相同的名字而型参不同,但是在C++中他们可以正常编译,不会因为同名而出现error。这是...
    99+
    2024-04-02
  • 高分面试从Hotspot源码层面剖析java多态实现原理
    目录C++是如何实现多态的JVM中的虚表Java是如何实现虚表分发本篇文章是接上篇文章【JVM的多态是如何实现的】写的,如果你还没看过,墙裂都建议你看一下。 传送门 &nb...
    99+
    2024-04-02
  • 【Android源码面试宝典】MMKV从使用到原理分析(二)
    上一章节,我们从使用入手,进行了MMKV的简单讲解,我们通过分析简单的运行时日志,从中大概猜到了一些MMKV的代码内部流程,同时,我们也提出了若干的疑问?还是那句话,带着目标(问题)去阅读一篇源码,那么往往收获的知识,更加深入&扎实。 ...
    99+
    2023-08-16
    面试 java mmkv mmap protocolbuf
  • 【Android源码面试宝典】MMKV从使用到原理分析(一)
    去年,我们写过一篇文章,对于android原生提供的key-value存储API SharePreference,进行了从使用到原理的深入分析,同时对其中存在的ANR问题、存取慢等问题,进行了深入的探索、总结。但是之前的文章,我们仅仅指...
    99+
    2023-08-17
    android android studio java
  • 怎么从C++的角度分析PYTHON的深浅拷贝
    这篇文章主要讲解了“怎么从C++的角度分析PYTHON的深浅拷贝”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么从C++的角度分析PYTHON的深浅拷贝”吧!今天看到python的列表深浅...
    99+
    2023-06-04
  • Android AsyncTask完全解析 带你从源码的角度彻底理解
    我们都知道,Android UI是线程不安全的,如果想要在子线程里进行UI操作,就需要借助Android的异步消息处理机制。之前我也写过了一篇文章从源码层面分析了Android...
    99+
    2022-06-06
    asynctask 源码 Android
  • 从源码角度解析Golang错误处理方式的工作原理
    Golang作为一门被广泛应用于云计算、分布式系统等领域的编程语言,其设计简洁、高效而且易用,其中错误处理机制也是其设计之一。本文将从源码角度分析Golang错误处理方式的工作原理,并...
    99+
    2024-03-14
    golang 错误处理 源码解析
  • Android源码面试宝典之JobScheduler从使用到原理分析(四)【JobScheduler、StateController 】
    上文,从Job任务的创建,到如何与JSC(JobServiceCotext)关联,到具体任务的绑定、执行进行了源码探索,相信大家到现在为止,对于JobScheduler的庐山真面目,脑海中已经有了些许自己的轮廓。但是,我们也知道,目前为...
    99+
    2023-08-19
    android 面试 java JobScheduler
  • 从SEO的角度分析电商网站怎么处理过期页面与内链结构
    小编给大家分享一下从SEO的角度分析电商网站怎么处理过期页面与内链结构,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧! 所有的电子商务网站都不可能永远长期出售一款产品,随着季节的变化与流行元素的变更,科技的进步,很...
    99+
    2023-06-09
  • Android源码面试宝典之JobScheduler从使用到原理分析(二)【JSS的启动】
    上文,我们以IntentService入手,先对JobScheduler进行了简单的实例编码使用。本文开始,我们开始就源码入手,开始深入学习、总结JobScheduler的内部实现原理。 前言 我们从使用代码入手,通过阅读JobSch...
    99+
    2023-08-16
    android java JSS JSC JobScheduler
  • Android源码面试宝典之JobScheduler从使用到原理分析(一)【JobScheduler的使用】
    我们之前总结过HandlerThread、IntentService,http://t.csdn.cn/U7Qzr,知道了,在子线程执行一些定时任务,android已经给我们提供了现成的一些API。但是我们也知道,这些老的API随着an...
    99+
    2023-08-19
    android JobScheduler JSS 源码 IntentService
  • HashMap源码怎么分析
    这篇文章主要介绍“HashMap源码怎么分析”,在日常操作中,相信很多人在HashMap源码怎么分析问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”HashMap源码怎么分析”的疑惑有所帮助!接下来,请跟着小编...
    99+
    2023-06-05
  • 如何从数据存储角度分析Redis为何这么快
    如何从数据存储角度分析Redis为何这么快,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。一、简介和应用Redis是一个由ANS...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作