Java中的LinkedList(链表)(如果想知道Java中有关LinkedList的知识点,那么只看这一篇就足够了!)

        前言:在Java编程语言中,Java集合框架提供了一组丰富的数据结构,以满足各种应用需求。其中,LinkedList作为一种常用的数据结构,具有独特的优势和广泛的应用场景。


✨✨✨这里是秋刀鱼不做梦的BLOG

✨✨✨想要了解更多内容可以访问我的主页秋刀鱼不做梦-CSDN博客

先让我们看一下本文大致的讲解内容:

目录

1.LinkedList的初识

2.LinkedList的创建

3.LinkedList中的常见API

(1)添加元素

(2)删除元素

(3)修改元素

(4)获取元素

4.LinkedList的遍历

(1)使用 for 循环

(2)使用增强型 for 循环

(3)使用 Iterator

(4)使用 ListIterator

(5)直接打印

5.LinkedList与ArrayList的区别


1.LinkedList的初识

        在开始学习LinkedList之前,让我们先了解一下什么是LinkedList:

        LinkedList(双向链表)是一种基于链表实现的线性数据结构,与ArrayList(顺序表)等基于数组实现的结构不同,它通过节点的引用来管理元素的存储和连接。

        其中每个节点包含三个主要部分:数据部分、指向下一个节点的指针(next)和指向前一个节点的指针(prev)。

下图很好的展示了什么是通过节点的引用来管理元素的存储和连接以及双向链表的构成:

       —— 通过上边的解释,我相信读者你已经对LinkedList(双向链表)有了自己的初步认知,那么接下来我们从LinkedList在整个集合框架中与其他类与接口的关系来继续介绍LinkedList(双向链表)

LinkedList与其他类与接口的关系:

从上图中我们可以了解到:

1.  LinkedList实现了List接口;
2.  LinkedList的底层使用了双向链表;
3.  LinkedList没有实现RandomAccess接口,因此LinkedList不支持随机访问;

        通过上边的简单介绍,相信读者已经大致的了解了Java中的LinkedList,那么接下来让我们开始正式的来学习Java中的LinkedList(双向链表)吧。

2.LinkedList的创建

        在Java中创建LinkedList有两种方式:

方法解释
LinkedList()无参构造
public LinkedList(Collection<? extends E> c)使用其他集合容器中元素构造List

(1)让我们使用一个案例来看一下使用空参创建LinkedList的方式:

import java.util.LinkedList;public class LinkedListExample {public static void main(String[] args) {// 创建一个空的LinkedListLinkedList<String> linkedList = new LinkedList<>();// 添加一些元素到LinkedList中linkedList.add("Element 1");linkedList.add("Element 2");linkedList.add("Element 3");// 输出LinkedListSystem.out.println("LinkedList: " + linkedList);}
}

(2)让我们使用一个案例来看一下使用使用其他集合容器中元素构造创建LinkedList的方式:

import java.util.LinkedList;
import java.util.ArrayList;public class LinkedListFromCollection {public static void main(String[] args) {// 创建一个ArrayList并添加一些元素ArrayList<String> arrayList = new ArrayList<>();arrayList.add("Element 1");arrayList.add("Element 2");arrayList.add("Element 3");// 使用ArrayList创建一个LinkedListLinkedList<String> linkedList = new LinkedList<>(arrayList);// 输出LinkedListSystem.out.println("LinkedList: " + linkedList);}
}

        ——这样我们就大致的了解了如何创建LinkedList了。

3.LinkedList中的常见API

        了解完如何创建一个LinkedList之后,让我们开始学习如何去操作所创建好的LinkedList。以下我们将会从增删查改四个方面来解释有关LinkedList的常用API。

(1)添加元素

  • add(E e): 在链表末尾添加元素。

  • add(int index, E element): 在指定位置插入元素。

  • addFirst(E e): 在链表头部添加元素。

  • addLast(E e): 在链表尾部添加元素。

接下来让我们使用案例来帮助你进一步理解:

import java.util.LinkedList;public class LinkedListAddExample {public static void main(String[] args) {LinkedList<String> linkedList = new LinkedList<>();// 在末尾添加元素linkedList.add("Element 1");linkedList.add("Element 2");// 在指定位置插入元素linkedList.add(1, "Inserted Element");// 在头部添加元素linkedList.addFirst("First Element");// 在尾部添加元素linkedList.addLast("Last Element");//打印结果System.out.println("final: " + linkedList);}
}

(2)删除元素

  • remove(): 移除并返回链表的第一个元素。

  • remove(int index): 移除并返回指定位置的元素。

  • removeFirst(): 移除并返回链表的第一个元素。

  • removeLast(): 移除并返回链表的最后一个元素。

让我们使用案例来帮助你进一步理解:

import java.util.LinkedList;public class LinkedListRemoveExample {public static void main(String[] args) {LinkedList<String> linkedList = new LinkedList<>();linkedList.add("Element 1");linkedList.add("Element 2");linkedList.add("Element 3");System.out.println("Initial LinkedList: " + linkedList);// 移除并返回第一个元素String removedElement = linkedList.remove();System.out.println("Removed Element: " + removedElement);// 移除指定位置的元素String removedIndexElement = linkedList.remove(1);System.out.println("Removed Element at Index 1: " + removedIndexElement);// 移除第一个元素linkedList.addFirst("New First Element");String removedFirstElement = linkedList.removeFirst();System.out.println("Removed First Element: " + removedFirstElement);// 移除最后一个元素String removedLastElement = linkedList.removeLast();System.out.println("Removed Last Element: " + removedLastElement);//打印结果System.out.println("final: " + linkedList);}
}

(3)修改元素

  • set(int index , E element): 修改指定索引位置的元素。

让我们使用案例来帮助你进一步理解:

import java.util.LinkedList;public class LinkedListSetExample {public static void main(String[] args) {// 创建一个LinkedList并添加一些元素LinkedList<String> linkedList = new LinkedList<>();linkedList.add("Element 1");linkedList.add("Element 2");linkedList.add("Element 3");linkedList.add("Element 4");// 输出初始的LinkedListSystem.out.println("Initial LinkedList: " + linkedList);// 使用set方法替换索引为2的元素String oldElement = linkedList.set(2, "New Element");// 输出被替换的旧元素System.out.println("Replaced Element: " + oldElement);// 输出修改后的LinkedListSystem.out.println("final: " + linkedList);}
}

(4)获取元素

  • get(int index): 获取指定位置的元素。

  • getFirst(): 获取第一个元素。

  • getLast(): 获取最后一个元素。

  • indexof(): 获取指定对象的索引(从左到右第一个)

  • lastindexof(): 获取指定对象的索引(从右到左第一个)

  • contains(): 是否包含指定元素

让我们使用案例来帮助你进一步理解:

import java.util.LinkedList;public class LinkedListGetExample {public static void main(String[] args) {LinkedList<String> linkedList = new LinkedList<>();linkedList.add("Element 1");linkedList.add("Element 2");linkedList.add("Element 3");// 获取指定位置的元素String elementAtIndex = linkedList.get(1);System.out.println("Element at Index 1: " + elementAtIndex);// 获取第一个元素String firstElement = linkedList.getFirst();System.out.println("First Element: " + firstElement);// 获取最后一个元素String lastElement = linkedList.getLast();System.out.println("Last Element: " + lastElement);// 获取指定对象的索引(从左到右第一个)int index = linkedList.indexOf("Element 1");System.out.println(index);// 获取指定对象的索引(从右到左第一个)int lastindex = linkedList.lastIndexOf("Element 3");System.out.println(lastindex);// 是否包含指定元素boolean contains = linkedList.contains("Element 2");System.out.println(contains);}
}

通过上边的案例加上解释,相信读者已经了解了Java中LinkedList中的常用API该如何使用了。

4.LinkedList的遍历

        在Java中遍历LinkedList的方式有五种:分别是使用 for 循环、使用增强型 for 循环、使用 Iterator、使用 ListIterator、以及直接打印。

        ——接下来让我们一个一个来进行讲解:

(1)使用 for 循环

import java.util.LinkedList;public class Main {public static void main(String[] args) {LinkedList<Integer> list = new LinkedList<Integer>();list.add(1);list.add(2);list.add(3);list.add(4);list.add(5);// 使用 for 循环遍历 LinkedListfor (int i = 0; i < list.size(); i++) {System.out.println(list.get(i));}}
}

(2)使用增强型 for 循环

import java.util.LinkedList;public class Main {public static void main(String[] args) {LinkedList<Integer> list = new LinkedList<Integer>();list.add(1);list.add(2);list.add(3);list.add(4);list.add(5);// 使用增强型 for 循环遍历 LinkedListfor (Integer element : list) {System.out.println(element);}}
}

(3)使用 Iterator

import java.util.LinkedList;
import java.util.Iterator;public class Main {public static void main(String[] args) {LinkedList<Integer> list = new LinkedList<Integer>();list.add(1);list.add(2);list.add(3);list.add(4);list.add(5);// 使用 Iterator 遍历 LinkedListIterator<Integer> iterator = list.iterator();while (iterator.hasNext()) {System.out.println(iterator.next());}}
}

(4)使用 ListIterator

import java.util.LinkedList;
import java.util.ListIterator;public class Main {public static void main(String[] args) {LinkedList<Integer> list = new LinkedList<Integer>();list.add(1);list.add(2);list.add(3);list.add(4);list.add(5);// 使用 ListIterator 从前向后遍历 LinkedListListIterator<Integer> listIterator = list.listIterator();while (listIterator.hasNext()) {System.out.println(listIterator.next());}// 使用 ListIterator 从后向前遍历 LinkedListwhile (listIterator.hasPrevious()) {System.out.println(listIterator.previous());}}
}

(5)直接打印

import java.util.LinkedList;public class Main {public static void main(String[] args) {LinkedList<Integer> list = new LinkedList<Integer>();list.add(1);list.add(2);list.add(3);list.add(4);list.add(5);// 直接使用 System.out.println 打印 LinkedListSystem.out.println(list);}
}

——以上就是Java中遍历LinkedList的五种方式。

5.LinkedList与ArrayList的区别

        在学习完了LinkedList之后,有读者就会发问,LinkedList和之前的ArrayList有什么区别呢?以下为LinkedList与ArrayList的区别:

不同点ArrayListLinkedList
存储空间上物理上一定连续逻辑上连续,但物理上不一定连续
随机访问支持O(1)不支持:O(N)
头插需要搬移元素,效率低O(N)只需修改引用的指向,时间复杂度为O(1)
插入空间不够时需要扩容没有容量的概念
应用场景元素高效存储+频繁访问任意位置插入和删除频繁

        以上就是LinkedList和之前的ArrayList的区别,读者要在合适的情况下选择合适的数据结构来进行操作。


以上就是本篇文章的全部内容了~~~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/43791.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

linux radix-tree 基数树实现详解

radix tree&#xff0c;又称做基数树&#xff0c;是一种适合于构建key(index)与value(item)相关联的数据结构。内核中使用非常广泛。本文主要聚焦linux内核基数树的代码实现,大量注释过的代码。 radix-tree组织结构如下: 1、数据结构 /** The bottom two bits of the slot de…

如何通过JSON-RPC向以太坊链发送签名交易数据?

概述 在以太坊开发当中,通过web3.js、ethers.js等提供的API方法,都可以完成与以太坊的转账交易。那么如何通过以太坊JSON-RPC与以太坊进行交易呢? 在以太坊的JSON-RPC当中,有eth_sendRawTransaction这个方法,可以向以太坊网络提交预签名的交易广播。 curl https://main…

IDEA阿里云OSS实现文件上传·解决苍穹外卖图片回显

简单交代配置阿里云OSS的思路 1. 首先去阿里云开通一个OSS服务&#xff0c;配置好一个自己的Bucket 2. 在IDEA配置Bucket 3. 拷贝官网的OSS工具类代码 package com.sky.utils;import com.aliyun.oss.ClientException; import com.aliyun.oss.OSS; import com.aliyun.oss.OSS…

同三维T80001编码器(带屏)系列视频使用操作说明书:高清HDMI编码器,高清SDI编码器,4K超清HDMI编码器,双路4K超高清编码器

同三维T80001编码器&#xff08;带屏&#xff09;系列视频使用操作说明书&#xff1a;高清HDMI编码器&#xff0c;高清SDI编码器&#xff0c;4K超清HDMI编码器&#xff0c;双路4K超高清编码器 同三维T80001编码器&#xff08;带屏&#xff09;系列视频使用操作说明书&#xff1…

【C语言】printf、fprintf、sprintf,scanf、fscanf、sscanf的区别

目录 前言 printf、fprintf、sprintf printf fprintf sprintf scanf、fscanf、sscanf scanf fscanf sscanf 前言 这几个函数曾出现在面试中&#xff0c;因为函数名都差不多&#xff0c;所以很让人迷惑啊~ 下面我们逐个分析。 printf、fprintf、sprintf 这三个函数的主…

子任务:IT运维的精细化管理之道

在当今的企业运营中&#xff0c;信息技术已成为支撑业务发展的核心力量。根据Gartner的报告&#xff0c;IT服务管理&#xff08;ITSM&#xff09;的有效实施可以显著提升企业的运营效率&#xff0c;降低成本高达15%&#xff0c;同时提高服务交付速度和质量。随着业务的复杂性和…

电脑工具箱神器——uTools

AI视频生成&#xff1a;小说文案智能分镜智能识别角色和场景批量Ai绘图自动配音添加音乐一键合成视频https://aitools.jurilu.com/ 很多人脑子里都有一些一个月只用两三次的软件&#xff0c;这些软件就这样积满了灰尘&#xff0c;需要的时候又不知道去哪里找。uTools 完美地解决…

笔记:在Entity Framework Core 中,常用Attribute有哪些

一、目的&#xff1a; Entity Framework Core (EF Core) 支持使用属性&#xff08;Attributes&#xff09;来配置模型和映射数据库。这些属性提供了一种声明性的方式来指定如何将类和属性映射到数据库表和列。以下是一些EF Core中常用的属性&#xff1a; 二、实现 1. [Table] …

力扣题解(环绕字符串中唯一的子字符串)

467. 环绕字符串中唯一的子字符串 定义字符串 base 为一个 "abcdefghijklmnopqrstuvwxyz" 无限环绕的字符串&#xff0c;所以 base 看起来是这样的&#xff1a; "...zabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcd....". 给你一个字符串 s …

深入理解 MyBatis 的 SqlSession:MyBatis 核心接口全解析

MyBatis 是一个非常流行的 Java 持久层框架&#xff0c;它简化了数据库操作&#xff0c;并且提供了强大的映射特性。在 MyBatis 中&#xff0c;SqlSession 是与数据库交互的核心接口。本文将详细介绍 SqlSession 的功能和使用方法。 什么是 SqlSession&#xff1f; SqlSessio…

MYSQL审批流程判断同一层级审批人是否全部通过审批

在做流程审批的时候&#xff0c;通常会出现某一层有多个审批人的情况&#xff0c;这个时候需要所有人都通过才会进入到下一步 数据结构如下图表格所示 每一个审批申请对应一个apply_id serial_no相同的代表是同一层级审批人 approval_status是审核状态 下面我们可以用一个SQL来…

Day50:单调栈 LeedCode 739. 每日温度 496.下一个更大元素 I 503. 下一个更大元素 II

739. 每日温度 给定一个整数数组 temperatures &#xff0c;表示每天的温度&#xff0c;返回一个数组 answer &#xff0c;其中 answer[i] 是指对于第 i 天&#xff0c;下一个更高温度出现在几天后。如果气温在这之后都不会升高&#xff0c;请在该位置用 0 来代替。 示例 1: 输…

【蓄势·致远】 同为科技(TOWE)2024年年中会议

2024年7月2日-8日&#xff0c;同为科技&#xff08;TOWE&#xff09;召开2024年年中工作会议。会议回顾上半年总体工作情况&#xff0c;分析研判发展形势&#xff0c;规划部署下半年工作。 为期一周的工作会议&#xff0c;由同为科技&#xff08;TOWE&#xff09;创始人、董事长…

futures.toArray(new CompletableFuture[0])

futures.toArray(new CompletableFuture[0]) 是一种常见的将 List 转换为数组的方式&#xff0c;特别是在需要将 List 传递给接受数组参数的方法时。让我们详细解释一下这段代码的具体含义和工作原理。 代码解释 假设 futures 是一个 List<CompletableFuture<Map<St…

【人脸识别、Python实现】PyQt5人脸识别管理系统

PyQt5人脸识别管理系统 项目描述主要功能效果展示获取源码 项目描述 接的一个基于宿舍管理系统与人脸识别的小单子。然后我把它优化了一些&#xff0c;现在开源一下。有需要的小伙伴自取&#xff0c;点个免费的关注就行 主要功能 1、录入学生基本信息、录入人脸 2、主页面展…

【Django】Django 使用连接串配置数据库

Django 使用连接串配置数据库 Django 配置数据库 修改 settings.py 中 DATABASES&#xff0c;这里以 mysql 数据库为例。 DATABASES {default: {ENGINE: django.db.backends.mysql,NAME: your_database_name,USER: your_database_user,PASSWORD: your_database_password,HO…

深度|不同数据系统中的“一致性”(Consistency)含义的区别

“你们的系统能实现强一致性吗&#xff1f;”作为过去几年一直在开发流处理系统的从业者&#xff0c;我经常被问到这个问题。我时常想自信地推销我们的产品&#xff0c;但现实情况是&#xff0c;回答这个问题并不简单。其中的挑战并不在于问题本身&#xff0c;而在于 “一致性”…

字节8年经验之谈!好用移动APP自动化测试框架有哪些?

移动App自动化测试框架是为了提高测试效率、降低测试成本而开发的一套工具和方法。好用的移动App自动化测试框架有很多&#xff0c;下面将介绍一些常用的框架&#xff0c;并提供一篇超详细和规范的文章&#xff0c;从零开始帮助你搭建一个移动App自动化测试框架。 1. Appium&a…

笔记:在Entity Framework Core中使用DeleteBehavior配置外键级联删除

一、目的&#xff1a; 在Entity Framework Core中&#xff0c;DeleteBehavior枚举定义了在删除主实体时如何处理与之关联的外键约束。DeleteBehavior.Cascade是DeleteBehavior枚举的一个选项&#xff0c;它指定当删除主实体时&#xff0c;所有具有外键引用的相关实体也将被自动…

十大优秀AI人工智能作词软件有哪些?

1、妙笔生词&#xff1a;国内专业智能作词工具&#xff0c;是一款非常优秀的国内作词软件&#xff0c;它可以选择语言&#xff0c;风格&#xff0c;韵脚一键生成歌词&#xff0c;也可以仿写歌词&#xff0c;可以续写歌词&#xff0c;可以智能取歌名&#xff0c;找优秀词句&…