容器中的单例集合——List接口的实现类之LinkedList

news2024/11/20 22:39:06

LinkedList容器类简介

        LinkedList容器类也是List接口的一个实现类,但是和之前介绍的ArrayList类、Vector类和Stack类不同,它的底层是通过双向链表结构来实现的。双向链表结构是链表结构的一种,链表结构最大的好处就是大大提高了容器中元素的增删效率,但是相对应的,它的查询效率会相应的降低。那么为什么会出现这种现象呢?这里就需要先了解链表结构。

        在java中我们可以通过数组来完成对数据的储存,但是这样会降低数据的增删效率。因为当我们对数组中的元素进行操作的时候,对应数组中的元素的索引大概率会发生变化。比如,当我在数组中的某个位置增加一个元素时,如果数组中该位置存在元素,那么无论它的后面是否存在元素,自这个元素开始(包括这个元素)往后的所有元素的索引都会增加1,而如果当我在指定位置删除某一个元素时,如果被删除的这个元素的后面有元素,那么这个元素后面的所有元素的索引都会减1。这样,如果数组的长度极长,那么对数组中的元素进行增删操作时就相当于同时要对后面的元素进行改变索引的操作,这样自然就降低了增删效率。

        但是链表结构不同,这里就以双向链表来说明。链表中的数据是以对象的方式来进行储存的,因此要在链表中找到一个数据我们需要先找到与这个数据相对因的地址,这里和我们之前做的对象存储时的内存分析是相符合的。链表结构中的每一个对象可以理解位一个单元,这些单元通过特殊的方式链接起来就组成了一个链表结构。这里完全可以用我们日常生活中见到的链状结构来类比。

        如下图所示,在java中我们把链表结构的每一元素都定义在一个类Node中,如果是双向链表,那么此时Node类中要定义一个变量用于储存元素本身,另外还要定义一个next变量和一个prev变量。其中next指向链表中下一个对象的地址而prev指向上一个元素的地址,通过这种方式我们就把java中那些分散存储的数据链接在了一起,成了一个链状结构。

        关于链表结构这里要注意两点,第一,链表中元素的地址是随机的,也就是说一个链表中相邻的两个元素他们在内存中存储的位置不一定是相邻的,它的存储和对象的存储一样,开辟的存储空间并不是相邻的,和方法栈的开辟方式不一样。这也就意味着任何一个元素只要将它的地址通过通过上面的方式进行链接,它就可以轻松地成为链表的一部分,因此链表的增删效率是比较高的。第二,链表的查询方式是从链表的头不开始的,当然双向链表也可以从尾部开始,但这也就意味着如果查询的元素离链表头或者尾比较远,那么就需要一番功夫了,所以链表的查询查询效率是比较低下的。

        综上,LinkedList类的是List的一个具体实现类,它的特点是查询效率低,增删效率高,并且线程是不安全的。 

LinkedList容器类的使用

        关于LInkedList容器类的使用有两套标准,第一套是是List标准,第二套是非List标准。首先,由于LinkedList容器类是List接口的具体实现类,因此它实现了List中的所有抽象方法,同时具备了List有序可重复的存储特征。通过这种标准来使用LinkedList容器类时,可以完全将其当作之前说过的几个类来使用,因为它同样实现了List接口种的所有方法,因此我们依旧可以正常的添加元素,获取元素,遍历元素,使用的方法也完全一样。

        为什么说使用LinkedList容器类还有一套标准呢?因为LinkedList的底层是通过双向链表来实现的,所以这个容器类中理应拥有对双向链表进行操作的方法,这些方法不能定义在List接口当中,因此不属于List标准。这些方法常用的有:addFist、addLast、getFirst、getLast、removeFirst、removeLast、pop、push以及isEmpoty。

        void addFist(E e):将指定元素插入到开头;

        void addLast(E e):将指定元素插入到结尾;

        E getFirst():获取此列表的第一个元素;

        E getLast():获取此列表的最后一个元素;

        E removeFirst():移除此列表第一个元素并返回;

        E removeLast():移除此列表最后一个元素并返回;

        E pop():从此列表所表示的栈中弹出一个元素,等效于removeFirst;

        void push(E e):将指定元素添加进此列表表示的栈中,相当于addFirst;

        boolean isEmpoty():判断由LinkedList类创建的的容器是否位空,如果为空,返回值true,否则返回值false。

        以上的几个方法均比较简单,通过对象使用,要注意就是pop方法和push方法,在使用时相当于将容器竖了起来,栈顶元素为双向列表的头元素。这里依旧用上面的那张双向链表的模型图来说明,当调用pop方法和push方法的时候,相当于把这个双向链表顺时针旋转90度,此时链表尾部被堵住,我们只能从上端获取元素,即双向链表的头元素为栈顶元素。以上方法的使用详见下面演示代码。

package com.container.demo;
import  java.util.List;
import java.util.LinkedList;
public class LinkedListTest {
    public static void main(String[] args) {
        List<String> list = new LinkedList<>();
        //添加元素
        list.add("a");
        list.add("b");
        list.add("c");
        list.add("a");
        //获取元素
        for (int i = 0; i < list.size(); i++) {
            System.out.println(list.get(i));
        }
        System.out.println("_______________");
        for (String str:list
             ) {
            System.out.println(str);
        }
        System.out.println("____LinkedList_____");
        LinkedList<String> linkedList = new LinkedList<>();
        linkedList.addFirst("a");
        linkedList.addFirst("b");
        linkedList.addFirst("c");
        for (String str:linkedList
             ) {
            System.out.println(str);
        }
        System.out.println("___________________");
        LinkedList<String> linkedList1 = new LinkedList<>();
        linkedList1.addLast("a");
        linkedList1.addLast("b");
        linkedList1.addLast("c");
        for (String str1:linkedList1
        ) {
            System.out.println(str1);
        }
        System.out.println("头元素:"+linkedList1.getFirst());
        System.out.println("尾元素:"+linkedList1.getLast());
        System.out.println("删除头元素"+linkedList1.removeFirst());
        System.out.println("删除尾元素"+linkedList1.removeLast());
        for (String str1:linkedList1
        ) {
            System.out.println(str1);
        }
        System.out.println("________________________");
        //删除头元素不返回
        linkedList1.pop();
        for (String str1:linkedList1
        ) {
            System.out.println(str1);
        }
        System.out.println("_____________________");
        linkedList1.push("h");
        for (String str1:linkedList1
        ) {
            System.out.println(str1);
        }
        System.out.println(linkedList1.isEmpty());
    }
}

 

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

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

相关文章

【Linux】中的常见的重要指令(中)

目录 一、man指令 二、cp指令 三、cat指令 四、mv指令 五、more指令 六、less指令 七、head指令 八、tail指令 一、man指令 Linux的命令有很多参数&#xff0c;我们不可能全记住&#xff0c;我们可以通过查看联机手册获取帮助。访问Linux手册页的命令是 man 语法: m…

吴恩达2022机器学习专项课程C2W2实验:Relu激活函数

目录 代码修改1.Activation2.Dense3.代码顺序 新的内容1.总结上节课内容2.展示ReLU激活函数的好处3.结论 代码案例一代码案例二1.构建数据集2.构建模型 2D1.构建数据集2.模型预测3.扩展 代码修改 1.Activation &#xff08;1&#xff09;需要添加代码from tensorflow.keras i…

webman使用summernote富文本编辑器

前言 Summernote富文本编辑器功能强大&#xff0c;可以直接从word直接复制内容过来而不破坏原有的文档格式&#xff0c;非常适合做商品详情等内容的编辑工具。本文将展示如何在php高性能框架webman中使用summernote编辑器。 下载 去Bootstrap 中文网、Summernote、jQuery官网…

小程序视频怎么保存到本地相册

在快节奏的生活中&#xff0c;小程序已成为我们获取信息和娱乐的重要渠道。但当您遇到那些精彩绝伦的小程序视频&#xff0c;是否曾想过如何将它们保存到本地相册&#xff0c;以便随时回味&#xff1f;无论您是安卓用户还是iPhone用户&#xff0c;本文将为您揭秘如何轻松实现这…

SpringBoot3.x 整合 Spring AI

Spring AI 已经发布了一段时间&#xff0c;虽然推出的时候就被人说只是一个套了 API 的壳&#xff0c;但是作为 Spring 生态的一个开源项目&#xff0c;用它来结合到现有业务系统中还是一个比较好的方案&#xff0c;毕竟像笔者当初为了接入 OpenAI 的 API&#xff0c;还专门学了…

计算机考研|408开始的晚,怎么入手复习?六个月保姆级规划

万事开头难&#xff0c;特别是408 大家在第一遍复习408的时候&#xff0c;基本上都有这个问题&#xff0c;就是复习速度慢&#xff0c;理解成本高&#xff0c;因为数据结构&#xff0c;计算机组成原理这些都是大一大二开始学的内容&#xff0c;等到自己准备考研的时候&#xf…

挖掘抖快销售榜TOP500,这些单品正在引爆夏日市场!

凉鞋、短裤、草席、风扇……一个个夏日“限定”品类在4月就开始冲上抖音、快手两大电商的品类销售榜时&#xff0c;预示着夏日营销在春季已悄悄打响。 在炎炎夏日来临之前&#xff0c;品牌方们都会迎接一次夏日营销“大考”&#xff0c;铆足了劲调动消费者的积极性&#xff0c;…

ASP+ACCESS基于WEB网上留言板

摘要 本文概述了ACCESS数据库及其相关的一些知识&#xff0c;着重论述ACCESS数据库和ASP的中间技术&#xff0c;构建一个简单的留言板。具体的实现是构造一个留言板系统&#xff0c;能很方便的和同学沟通和交流。留言板具有功能强大、使用方便的特点。用户以个人的身份进入&am…

【话题】AIGC行业现在适合进入吗

大家好&#xff0c;我是全栈小5&#xff0c;欢迎阅读小5的系列文章&#xff0c;这是《话题》系列文章 目录 引言AIGC的发展阶段市场需求时机是否合适优势挑战 文章推荐 引言 在撰写关于当前是否适合进入AIGC&#xff08;人工智能生成内容&#xff09;行业的文章之前&#xff0…

LeetCode HOT 100:3. 无重复字符的最长字串

1. 链接 . - 力扣&#xff08;LeetCode&#xff09; 2. 题目描述 3. 题解 方法一&#xff1a;滑动窗口 哈希表 根据题意&#xff1a; 1. 遍历所有可能的子串——利用滑动窗口表示子串&#xff1b; 2. 保证滑动窗口内不包含重复字符——需要哈希表map记录字符出现的下标。…

模型评价指标笔记:混淆矩阵+F1+PR曲线+mAP

评价指标 二分类评价指标 混淆矩阵 TP: 正确预测为了正样本&#xff0c;原来也是正样本 FN: 错误的预测为负样本&#xff0c;原来是正样本 (漏报&#xff0c;没有找到正确匹配的数目) FP: 错误的预测为正样本&#xff0c;原来是负样本 (误报&#xff0c;没有的匹配不正确) TN…

解决ModuleNotFoundError: No module named ‘dnnlib‘问题

复现论文采用了大佬的库&#xff0c;这时候运行报错&#xff1a; 尝试采用&#xff1a;pip install dnnlib解决&#xff0c;但下载源中并不包含该依赖。 解决方法&#xff1a; pip install https://github.com/podgorskiy/dnnlib/releases/download/0.0.1/dnnlib-0.0.1-py3-n…

带你看懂认沽期权交易是什么意思?

今天期权懂带你了解带你看懂认沽期权交易是什么意思&#xff1f;认沽期权是期权交易中的一种方向性策略&#xff0c;也被称为“看跌期权”。 认沽期权交易是什么意思&#xff1f; 认沽期权&#xff0c;亦称为看跌期权&#xff0c;是期权交易中的一种类型&#xff0c;它提供给买…

【NVM】持久内存的架构

1 内存数据持久化 1.1 数据持久化 持久内存系统包含如下关键组件&#xff1a;微处理器、连接微处理器内存总线上的持久内存模组&#xff08;Persistent MemoryModule&#xff0c;PMM&#xff09;及持久内存上的非易失性存储介质。 使用持久内存来实现数据的持久化&#xff0c…

基于 Java 的浏览器——JxBrowser使用分享

软件介绍 JxBrowser 是一个基于 Java 的浏览器&#xff0c;它使用 Chromium 引擎来提供高性能的网页渲染和丰富的功能。它支持多种 GUI 框架&#xff0c;如 Swing、JavaFX 和 SWT&#xff0c;使得在 Java 应用程序中嵌入浏览器组件变得简单。 JxBrowser 是一个适用于多种用途…

linux常用软件源码安装-2

jdk、tomcat、Apache、nginx、mysql、redis、maven、nexus安装文档&#xff1a;linux常用软件源码安装 9.sonarqube安装 前置条件&#xff1a;mysql5.6和jdk8 1.下载 官网 2.安装unzip并解压sonarqube&#xff0c;然后移动到/usr/local yum install -y unzip unzip sonarq…

excel poi的titleRows 和 headRows含义

titleRows 这个参数的意思是&#xff1a;excel标题占多少行&#xff0c;而不是第几行headRows 这个参数的意思是&#xff1a;excel表头占几行&#xff0c;而不是第几行&#xff08;多行的意思是合并的行数&#xff09; 比如有一个excel如下&#xff0c;1-2行是标题&#xff0c…

大语言模型实战——搭建纯本地迷你版RAG

1. 概念 RAG&#xff08;Retrieval Augmented Generation&#xff09;检索增强生成&#xff0c;它结合了搜索技术和大语言模型的提示词功能&#xff0c;以搜索算法找到的信息作为背景上下文&#xff0c;来辅助大语言模型&#xff08;Large Language Model, LLM&#xff09;生成…

CentOS部署NFS

NFS服务端 部署NFS服务端 sudo yum install -y nfs-utils挂载目录 给 NFS 指定一个存储位置&#xff0c;也就是网络共享目录。一般来说&#xff0c;应该建立一个专门的 /data 目录&#xff0c;方便起见使用临时目录 /tmp/nfs&#xff1a; mkdir -p /tmp/nfs #修改权限 chmo…

vue 引入 emoji 表情包

vue 引入 emoji 表情包 一、安装二、组件内使用 一、安装 npm install --save emoji-mart-vue二、组件内使用 import { Picker } from "emoji-mart-vue"; //引入组件<picker :include"[people,Smileys]" :showSearch"false" :showPreview&q…