Java开发 - 双向链表不可怕

简介: Java开发 - 双向链表不可怕

前言


说起链表,那还是当初上学的时候学习的,印象里就觉得像锁链一样一环扣一环,后来工作后就几乎没实际接触过链表,每当遇到链表,总是不知道该怎么讲,因为对链表的本质一无所知。也是在学习了Java后,才明白了链表的运行机制,原来如此简单,这里将和大家一起来分享双向链表的一些知识。


什么是双向链表


链表是一种数据结构,由若干个节点组成,每个结点又分为三部分:前驱节点,元素,后继节点。双向链表中的结点是以游离状态存在的,意思是非连续的,这让我们想到了数组,因为数组中的数据是连续存在的,在内存上也是如此。

1.png

用一张图来表示双向链表的结构,第一个是头节点,最后一个是尾节点,头尾不能相连,否则就是另一种数据结构,后面再说。


双向链表在Java中的使用


LinkedList


在上面的图中,我们认为中间部分保存的是对象,但实际上保存的是对象的地址。


为了便于说明,后面我们将针对LinkedList来进行讲解。


LinkedList的演化

从JDK1.8开始,LinkedList的数据结构为双向链表

在JDK1.8之前,LinkedList的数据结构是双向循环链表(头尾相接),如下图

1.png


LinkedList的查询方式  


双向循环链表的查找过程与双向链表相同,都遵从下面的原则:


对半查询:

小于一半,则从header开始顺序查找;

大于一半,则从header开始逆序查找,双向链表头尾不相连,则从尾部开始逆序查找。


增加元素


//在链表尾部添加元素,创建一个新节点,并让新节点和上一个节点建立双向链表的关系
add(E)
//在指定位置插入元素,先断开对应位置的链,然后重新构建此位置前后链的关系
add(int index,E e)


删除元素

//删除指定位置的元素,实际上是断开对应位置链,
//并将移除后的位置前后的元素重新构建链的过程
remove(int index)


修改元素

//将新元素替换指定位置的元素
set(int index,E e)


查询元素

//查询方式:对半查找
//若查找的位置小于链表长度的一半,则从头结点开始顺序查找。否则,从尾结点开始逆序查找。
get(int index)


ArrayList和LinkedList的区别


ArrayList底层实现是数组,而LinkedList底层是双向链表;

数据结构不同,则性能不同;

为什么不直接说谁性能好呢?这个不好说,我们慢慢往下看。


查询比较


ArrayList是数组实现的,它有下标,查询效率非常高,时间复杂度为o(1)。


LinkedList我们已经看过它的数据结构,说讲它查询的方式:对半查找。所以查询头尾元素效率很高,若是中间元素,那么效率将取决于LinkedList的大小和元素所处位置是否靠近头尾,所以效率偏低。


时间复杂度:o(1)    o(n) 用来衡量数据结构/算法效率的一个标志,n值越小,查询效率越高。


增删比较


ArrayList在尾部增删元素,效率会很高,若是在非尾部增删,则该位置之后的所有元素都需要中心排列。所以,其效率不高。


LinkedList在头尾进行增删元素,效率会很高,若是在靠近中间部分进行增删,效率则偏低,这是因为增删需要先查询,查询的效率低了,增删效率也会跟着低。


对比总结


ArrayList查询性能高于LinkedList,但若是首尾查询,LinkedList的效率也很高。


对于增删,头尾部增删,用LinkedList,其他部位增删,ArrayList和LinkedList半斤八两。


总的来说,ArrayList偏向于查询,所以我们在实际开发中用ArrayList更多。


结尾


结尾附上LinkedList源码,感兴趣的小伙伴自行下载查看,另外,关于链表,在后面的二叉树部分还会有部分涉及,欢迎持续关注。

目录
相关文章
|
1月前
|
Java API Maven
如何使用Java开发抖音API接口?
在数字化时代,社交媒体平台如抖音成为生活的重要部分。本文详细介绍了如何用Java开发抖音API接口,从创建开发者账号、申请API权限、准备开发环境,到编写代码、测试运行及注意事项,全面覆盖了整个开发流程。
108 10
|
29天前
|
监控 Java API
如何使用Java语言快速开发一套智慧工地系统
使用Java开发智慧工地系统,采用Spring Cloud微服务架构和前后端分离设计,结合MySQL、MongoDB数据库及RESTful API,集成人脸识别、视频监控、设备与环境监测等功能模块,运用Spark/Flink处理大数据,ECharts/AntV G2实现数据可视化,确保系统安全与性能,采用敏捷开发模式,提供详尽文档与用户培训,支持云部署与容器化管理,快速构建高效、灵活的智慧工地解决方案。
|
19天前
|
Java 开发者 微服务
Spring Boot 入门:简化 Java Web 开发的强大工具
Spring Boot 是一个开源的 Java 基础框架,用于创建独立、生产级别的基于Spring框架的应用程序。它旨在简化Spring应用的初始搭建以及开发过程。
38 6
Spring Boot 入门:简化 Java Web 开发的强大工具
|
6天前
|
存储 JavaScript 前端开发
基于 SpringBoot 和 Vue 开发校园点餐订餐外卖跑腿Java源码
一个非常实用的校园外卖系统,基于 SpringBoot 和 Vue 的开发。这一系统源于黑马的外卖案例项目 经过站长的进一步改进和优化,提供了更丰富的功能和更高的可用性。 这个项目的架构设计非常有趣。虽然它采用了SpringBoot和Vue的组合,但并不是一个完全分离的项目。 前端视图通过JS的方式引入了Vue和Element UI,既能利用Vue的快速开发优势,
52 13
|
11天前
|
算法 Java API
如何使用Java开发获得淘宝商品描述API接口?
本文详细介绍如何使用Java开发调用淘宝商品描述API接口,涵盖从注册淘宝开放平台账号、阅读平台规则、创建应用并申请接口权限,到安装开发工具、配置开发环境、获取访问令牌,以及具体的Java代码实现和注意事项。通过遵循这些步骤,开发者可以高效地获取商品详情、描述及图片等信息,为项目和业务增添价值。
44 10
|
5天前
|
前端开发 Java 测试技术
java日常开发中如何写出优雅的好维护的代码
代码可读性太差,实际是给团队后续开发中埋坑,优化在平时,没有那个团队会说我专门给你一个月来优化之前的代码,所以在日常开发中就要多注意可读性问题,不要写出几天之后自己都看不懂的代码。
40 2
|
14天前
|
JavaScript 安全 Java
java版药品不良反应智能监测系统源码,采用SpringBoot、Vue、MySQL技术开发
基于B/S架构,采用Java、SpringBoot、Vue、MySQL等技术自主研发的ADR智能监测系统,适用于三甲医院,支持二次开发。该系统能自动监测全院患者药物不良反应,通过移动端和PC端实时反馈,提升用药安全。系统涵盖规则管理、监测报告、系统管理三大模块,确保精准、高效地处理ADR事件。
|
1月前
|
开发框架 Java 关系型数据库
Java哪个框架适合开发API接口?
在快速发展的软件开发领域,API接口连接了不同的系统和服务。Java作为成熟的编程语言,其生态系统中出现了许多API开发框架。Magic-API因其独特优势和强大功能,成为Java开发者优选的API开发框架。本文将从核心优势、实际应用价值及未来展望等方面,深入探讨Magic-API为何值得选择。
42 2
|
1月前
|
监控 前端开发 Java
【技术开发】接口管理平台要用什么技术栈?推荐:Java+Vue3+Docker+MySQL
该文档介绍了基于Java后端和Vue3前端构建的管理系统的技术栈及功能模块,涵盖管理后台的访问、登录、首页概览、API接口管理、接口权限设置、接口监控、计费管理、账号管理、应用管理、数据库配置、站点配置及管理员个人设置等内容,并提供了访问地址及操作指南。
|
1月前
|
IDE Java 编译器
开发 Java 程序一定要安装 JDK 吗
开发Java程序通常需要安装JDK(Java Development Kit),因为它包含了编译、运行和调试Java程序所需的各种工具和环境。不过,某些集成开发环境(IDE)可能内置了JDK,或可使用在线Java编辑器,无需单独安装。
64 1