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

news2024/9/9 6:05:31

        前言:在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) {
        // 创建一个空的LinkedList
        LinkedList<String> linkedList = new LinkedList<>();

        // 添加一些元素到LinkedList中
        linkedList.add("Element 1");
        linkedList.add("Element 2");
        linkedList.add("Element 3");

        // 输出LinkedList
        System.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创建一个LinkedList
        LinkedList<String> linkedList = new LinkedList<>(arrayList);

        // 输出LinkedList
        System.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");

        // 输出初始的LinkedList
        System.out.println("Initial LinkedList: " + linkedList);

        // 使用set方法替换索引为2的元素
        String oldElement = linkedList.set(2, "New Element");

        // 输出被替换的旧元素
        System.out.println("Replaced Element: " + oldElement);

        // 输出修改后的LinkedList
        System.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 循环遍历 LinkedList
        for (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 循环遍历 LinkedList
        for (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 遍历 LinkedList
        Iterator<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 从前向后遍历 LinkedList
        ListIterator<Integer> listIterator = list.listIterator();
        while (listIterator.hasNext()) {
            System.out.println(listIterator.next());
        }

        // 使用 ListIterator 从后向前遍历 LinkedList
        while (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 打印 LinkedList
        System.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.coloradmin.cn/o/1918602.html

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

相关文章

MesooRF:经典蓝牙模块与低功耗蓝牙模块如何区分?

从蓝牙4.0开始&#xff0c;有两种蓝牙芯片模块&#xff1a;经典蓝牙模块(BT)和低能耗(BLE)蓝牙模块。 经典蓝牙是在之前的蓝牙1.0&#xff0c;1.2&#xff0c;EDR 2.0&#xff0c;EDR 2.1&#xff0c;EDR 3.0的基础上发展完善的&#xff0c;而低功耗蓝牙是在Nokia的Wibree标准上…

客户关系管理怎么做?这4个工具一定要会用!

在商海浮沉中&#xff0c;每一位企业家和销售经理都深知&#xff0c;客户是企业生存与发展的基石。但如何有效管理这些宝贵的资源&#xff0c;让每一次互动都成为加深关系、促进成交的契机&#xff0c;却是一门艺术加科学的结合体。今天&#xff0c;咱们就来聊聊客户关系管理&a…

79. UE5 RPG 创建技能冷却和消耗

在这一篇里面&#xff0c;我们接着优化技能&#xff0c;现在角色添加的主动技能能够同步到ui上面。我们在这一篇文章里面&#xff0c;完善技能的消耗&#xff08;释放技能减少蓝量&#xff09;和冷却机制。 我们可以看到&#xff0c;在技能类默认值这里&#xff0c;可以设置它的…

AIGC时代创意设计师从“创作”向“智作”升级

随着人工智能技术的飞速发展&#xff0c;AIGC&#xff08;AI Generated Content&#xff0c;即人工智能生成内容&#xff09;时代已经到来&#xff0c;为创意设计领域带来了前所未有的变革。在这一时代背景下&#xff0c;创意设计师们正经历着从传统的“创作”向“智作”的转型…

SCSA第五天

NAT 静态NAT 动态NAT Napt 一对多 --- easy ip 多对多的NAPT 服务器映射 源NAT --- 基于源IP地址进行转换&#xff0c;包含静态NAT&#xff0c;动态NAT以及NAPT 目标NAT --- 基于目标IP地址进行转换&#xff0c;以前的端口映射 双向NAT --- 同时转换源IP地址和目标IP地…

SpringSecurity中文文档(Servlet Authorization Architecture )

Authorization 在确定了用户将如何进行身份验证之后&#xff0c;还需要配置应用程序的授权规则。 Spring Security 中的高级授权功能是其受欢迎的最有说服力的原因之一。无论您选择如何进行身份验证(无论是使用 Spring Security 提供的机制和提供者&#xff0c;还是与容器或其…

Point Cloud Library (PCL) for Python - pclpy 安装指南

以下所有的版本号务必按照说明安装。 1.安装 Python 3.6 https://www.python.org/ftp/python/3.6.8/python-3.6.8-amd64.exe #或 百度网盘 2.确认 Python 版本为 3.6.x python #Python 3.6.8 (tags/v3.6.8:3c6b436a57, Dec 24 2018, 00:16:47) [MSC v.1916 64 bit (AMD64)] on…

BUUCTF[堆][unsortbin]

fastbin Attack 、unsorted bin 思路&#xff1a; 利用double free的方式泄漏出unsortbin中的main_arena地址。 释放一个不属于fast bin 的 chunk&#xff0c;并且该 chunk 不和 top chunk 紧邻时&#xff0c;该 chunk 会被首先放到 unsorted bin 中。 当有一个(或几个) sma…

问题清除指南|Dell OptiPlex 7070 升级 win11 开启 TPM 2.0 教程

前言&#xff1a;最近想把实验室台式机的系统从 Windows 10 升级到 Windows 11&#xff0c;遇到一点小问题&#xff0c;在此记录一下解决办法。 ⚠️ 注&#xff1a;本教程仅在 Dell OptiPlex 7070 台式机系统中测试有效&#xff0c;并不保证其余型号机器适用此教程。 参考链接…

不同材质酒店智能开关的功能特点详解

在当今的酒店行业中&#xff0c;智能开关已成为提升客户体验和管理效率的重要设备。而不同材质的智能开关&#xff0c;不仅在外观上各具特色&#xff0c;其功能特点也有所差异。 玻璃材质智能开关&#xff1a; 玻璃材质的智能开关给人一种时尚、简约且高端的感觉。其表面光滑&a…

Iridient Developer:解锁Mac RAW图像处理的极致潜力,打造专业级色彩与细节

Iridient Developer for Mac是一款专为Mac用户设计的RAW图像调整软件&#xff0c;它以其卓越的性能和丰富的功能&#xff0c;赢得了众多摄影师的青睐。以下是对这款软件的详细介绍&#xff1a; 一、强大的RAW图像处理能力 Iridient Developer专为处理RAW图像而设计&#xff0…

连锁行业观察:一线门店设备如何运维?化“管理”为“服务”

连锁零售行业的数字化发展&#xff0c;离开不了大量智能设备的支撑&#xff0c;比如我们日常见到的各种门店互动终端、自助收银设备、无人值守售货机等等。 由于连锁行业的特性&#xff0c;这些设备往往位置分散&#xff0c;数量众多&#xff0c;难以集中管理。一旦这些设备遇…

48、DR+keepalive

DRkeepalive 注意vrrp_iptables:##不创建iptables策略 keepalive的脑裂问题怎么解决&#xff1f; DRkeepalive解决主服务器挂了&#xff0c;备服务器立即进入工作。 DRkeepalive思路 主调度器&#xff1a;test1&#xff1a;192.168.168.100副调度器&#xff1a;test2&#…

渲染100农场是什么?渲染100邀请码1a12

作为设计师&#xff0c;渲染农场肯定听过&#xff0c;它在视觉行业有着重要作用&#xff0c;那么渲染农场是什么您知道吗&#xff1f;今天我们就来看看吧。 渲染农场&#xff0c;英文名Render Farm&#xff0c;是一种分布式并行计算系统&#xff0c;是利用现成的以太网、CPU和…

网上下载的视频怎么转成mp4格式?教你一招轻松解决

网上拥有许多的视频资源&#xff0c;动漫&#xff0c;短视频&#xff0c;影视等等都层出不穷&#xff0c;很多小伙伴都会把一些视频进行下载下来&#xff0c;不过下载下来的视频都不是MP4格式的&#xff0c;在兼容性方面会比较的麻烦&#xff0c;会有播放器不支持的情况&#x…

【MySQL】mysqldumpslow工具 -- 总结慢查询日志文件

1. 作用 在平时使用MySQL数据库时&#xff0c;经常进行查询操作&#xff0c;有些查询语句执行的时间非常长&#xff0c;当执行时间超过设定的阈值时&#xff0c;我们称这个查询为慢查询&#xff0c;慢查询的相关信息通常需要用日志记录下来称为慢查询日志&#xff0c;mysqldum…

java项目中与客户对接接口

个人名片 &#x1f393;作者简介&#xff1a;java领域优质创作者 &#x1f310;个人主页&#xff1a;码农阿豪 &#x1f4de;工作室&#xff1a;新空间代码工作室&#xff08;提供各种软件服务&#xff09; &#x1f48c;个人邮箱&#xff1a;[2435024119qq.com] &#x1f4f1…

德国哥廷根大学《Nature Geoscience》最新成果!揭示热带森林对季节性干旱的响应机制!

本文首发于“生态学者”微信公众号&#xff01; 越来越多的研究称热带森林的生产力受到养分限制&#xff0c;这可能影响其对季节性干旱的反应&#xff08;Nature正刊&#xff01;亚利桑那大学 博士生陈舒立一作兼通讯 最新重磅成果&#xff01;&#xff1b;《Nature Geoscience…

MYSQL查询审批流程最新的一条记录示例

首先说下需求 就是我们有一个申请审批流程记录表&#xff0c;用来处理申请的流程审批&#xff0c;要求就是普通用户只能看见自己的审批记录&#xff0c;管理员可以看见所有的审批记录&#xff0c;这里有个问题就是管理员本身也可能是审批人&#xff0c;所以查询的时候就会稍微复…

【深度好文】合作伙伴关系管理自动化:双向共赢新趋势

在当今快速变化的商业环境中&#xff0c;合作伙伴关系已成为企业成功的关键因素之一。为了更高效地管理这些关系&#xff0c;合作伙伴关系管理自动化正逐渐成为行业的新趋势&#xff0c;它不仅简化了管理流程&#xff0c;更促进了双方共赢的局面。 一、传统管理 VS 自动化管理 …