【JAVA】链式存储(封装)

Java链式存储LinkedList----与ArrayList比较 同学们,今天我们一起来看看List接口的另一种实现LinkedList,看看如何实现对LinkedList链表的搭建.我们需要结合底层的逻辑,更深层次的熟悉链表数据结构.最后比较我们前面讲到的ArrayList动态数组实现,各自应用场景的不同.在学习List接口的两种不同的实现方式时,我们要尝试比较,在未来的应用时,选择合适的数据结构要取决于不同的应用场景.前提是大家对这两种结构的熟练程度是非常高的,希望大家可以对找点题目练练手,加深印象.!! 阅读详情

在链式存储中,我们每创建一个对象,其中所存的东西都分为,数据部分和指针部分。指针部分保存该对象的下一个节点对象,即下一个对象的地址,在Java里面保存地址的我们称之为引用,在C语言里面我们称之为指针。
我们可以通过该引用去指向下一个对象,同样下一个对象也有自己的指针部分。每当我们要存一个元素到这个集合里头时,都要创建一个新的节对象。结构与前面的对象相同,并且通过指针部分将其连接在其中。
如果我们要进行下面的操作,则

访问对象
首先我们要拿到链表中第一个对象节点的地址,持有第一个对象节点的引用,有时候也称其为头指针head。我们找到这个"头"之后,通过头指针的引用找到第一个对象,后面的对象也就找到了。并且可以对目标对象的数据进行操作。
因为链表是挨个访问,所以相对于数组,添、删、改是其优势,对象访问是其短板。

链表中,对象的添、删、改只需要创建一个新的对象,然后对该对象的指针进行修改

添加
在这里插入图片描述
删除
在这里插入图片描述
链表中,对象的访问是需要一个一个遍历的,而数组中,只要给出了索引就可以直接跳过前面的元素,找到相应位置的元素。

现在有一个问题是,我们利用节点来添、删、改、查数据时,也是有些麻烦的。那么能不能有更简便的方法来解决这个问题?

封装
对于用户来说,我们应该把最原始的数据封装起来,不让他们知道里面的情况。
看如下代码:

/**
 * 链式存储(已封装)
 */
public class LinkedList {

    //只要使用链表,我们就需要节点
    //我们可以将这个节点放到类的内部,使其私有化。
    //从而成为内部类。
    //而写到类的内部的原因,
    //是因为这个内部类旨在链表里边用,外边没有用。
    //它只是作为链表类的节点,对于用户来说是不需要知道的。
    private class Node {
        private int data;
        private Node next;

        public int getData() {
            return data;
        }

        public void setData(int data) {
            this.data = data;
        }

        public Node getNext() {
            return next;
        }

        public void setNext(Node next) {
            this.next = next;
        }

    }



    //创建链表,需要创建头结点引用。且开始为空。
    private Node head = null;
    private int size = 0;

    //我们要做的以下操作是在链表里进行的

    /**
     * 添
     * @param d
     */
    public void add(int d) {
        //创建节点
        Node n = new Node();
        n.setData(d);

        //判断头结点是否为空
        if (head == null)
            head = n;
        else {
            //临时变量
            Node temp = head;
            //遍历
            //这里要注意的是,如果只有一个元素,
            //我们一次都不要循环,这样加第二次的时候,
            //直接给temp赋值。
            for (int i = 0; i < size - 1; i++) {
                //temp始终指向当前元素的下一个元素
                temp = temp.getNext();
            }
            //当这里一次都不循环时,
            //我们就给头结点所指向的对象的next直接进行赋值。
            //当循环结束指向最后一个元素的时候,
            //我们就给指向头结点的对象的next进行赋值(添入新的数据)即可。
            temp.setNext(n);
        }
        //当出了块之后,这里面声明的变量就没了。
        size++;
    }

    /**
     * 取
     * @param i
     * @return
     */
    public Integer get(int i) {
        if (i == 0){
            return head.getData();
        }
        Node temp = head;
        for (int t = 0; t < i; t++) {
            temp = temp.getNext();
            if (temp == null) {
                //如果temp为空,说明就没有第i个节点。
                //如果不判断,就会报空指针异常。
                return null;
            }
        }
        //若为返回空,则说明到了第i个元素了。
        return temp.getData();
    }
}
public class 集合的概念{
    public static void main(String[] args) {
    /**
         *链式存储:
         * 添加(未封装)
         */
        //创建头结点
        Node head = new Node();/*head:Node@496  此为哈希码,且哈希码是惟一的*/
        //头结点数据域,存入一个数据。
        head.setData(20);/*head:Node@496*/

        //head.setNext();// 头结点指针域,目前什么都没有。

        //因为我们要存的不只是一个节点,所以要拿到下一个节点。
        //head.getNext();//因为此时next为空,
        //所以head指向的是刚刚new出来的Node。
        //而head也拿到了Node里的所有数据,
        //其中就包括set方法。

        //同时,next域的指针是空的,
        // 我们可以在给其new一个新的节点。
        Node n = new Node();/*n:Node@497*/
        //此时n节点是独立的,目前和head节点还没有关系。

        //给其赋值
        n.setData(50);/*n:Node@497*/

        //赋值给next,
        //让next等于n要连接的下一个节点的地址。
        //其实next引用类型还是Node,
        //实际上就是通过set方法,
        //把n的地址交给了head里面的next引用。
        head.setNext(n);/*head:Node@496     n:Node497*/
        n = new Node();/*n:Node@497*/
        //到这里,head可以访问自己的数据,
        //同样也可以访问下一个节点里的数据,
        //这就说明,这两个节点都在同一个即合里了。

        n.setData(60);/*n:Node@498*/
        head.getNext().setNext(n);
        /*head:Node@496     n:Node498*/
        //在这里,新节点的next总是空的。

        //如此重复
        //......

        //取数据
        System.out.println(head.getNext().getNext().getData());

 /**
         * 添加(链式存储 已封装)
         */
        LinkedList bb=new LinkedList();
        bb.add(20);
        bb.add(222);
        bb.add(233);

        /**
         * 取(链式存储 已封装)
         */
        //注意,这里面的用法和ArrayList一样,
        //但是结构不一样。
        System.out.println(bb.get(2));
    }
}

class Node {
    private int data;//数据部分
    private Node next;//节点部分

    public int getData() {
        return data;
    }

    public void setData(int data) {
        this.data = data;
    }

    public Node getNext() {
        return next;
    }

    public void setNext(Node next) {
        this.next = next;
    }
}
数据的结构 数据结构主要描述的是数据元素之间的逻辑关系、数据在计算机系统中的存储方式和数据的运算三个方面的内容,即数据的逻辑结构、存储结构和数据的操作集合。 阅读详情

相关推荐

Java写的安卓毕业APP:能听歌、看图文、存段子、查图片的完整工程包

一套可直接运行的Android毕业项目源码,用Java开发,集成四大实用功能:音乐播放支持后台Service控制MediaPlayer,带播放队列、进度同步和状态广播;图文阅读模仿知乎样式,用RxJava异步加载内容与CSS,拼接HTML后WebView渲染;段子和图片浏览采用RecyclerView实现分类列表,对接图片API,支持双指缩放查看;收藏系统基于泛型封装的轻量级关系型数据库,统一处理文章、图片、音频等不同类型数据的增删。代码结构清晰,Adapter和ViewHolder做了合理抽取,UI层使用

9o8p7i6u5y的博客 224

java 链式封装_【JAVA】链式存储(封装)

在链式存储中,我们每创建一个对象,其中所存的东西都分为,数据部分和指针部分。指针部分保存该对象的下一个节点对象,即下一个对象的地址,在Java里面保存地址的我们称之为引用,在C语言里面我们称之为指针。我们可以通过该引用去指向下一个对象,同样下一个对象也有自己的指针部分。每当我们要存一个元素到这个集合里头时,都要创建一个新的节对象。结构与前面的对象相同,并且通过指针部分将其连接在其中。如果我们要进行...

weixin_39622747的博客 402

java发送邮件封装,链式传递参数

使用示例:。SendMailParam param = SendMailParam.Builder .protocol("smtp") .host("smtp.163.com") .port("25") .isAuth("true") .isEnabledDebugMod("true") .sender(sender) //发件人及发件人账号,请用自己的账号,密码 .account(ACCOUNT) .password(PASSWORD) //发件人密码,请用自己的账号,密码 .sentDate(new Date()) .subject("使用JavaMail发送混合组合类型的邮件测试主题") // .attachFiles(attachFiles) .content(contentBuf.toString()) .toRecipients(toRecipients); ServiceResponse<String> serviceResponse = SendMailSynUtils.sendEmail(param); System.out.println("errorNO = "+ serviceResponse.getErrorNO()); System.out.println("errorMsg = "+ serviceResponse.getErrorMsg());

数据结构-链表的Java实现

顺序表的Java实现 1.链式存储结构 顺序存储结构要求所有元素依次存放在一片连续的存储空间中,而链式存储结构,无需占用一整块存储空间。但为表示结点之间的关系,需要给每个结点附加指针字段,用于存放后继元素的存储地址。 仍然使用我们在学习顺序表时使用的ElemType作为数据元素。建一个新的LinkNode类作为结点,结点包含一个ElemType作为数据域,附加一个LinkNode作为指针域,用于存...

qq_42200733的博客 486

java实现单链表

使用java内部类实现对C语言中结构体的封装,不使用指针,照样可以完成链表

深度解析:如何通过NodeRed实现私有485协议VRF中央空调与HomeAssistant的无缝对接

本文详细介绍了如何利用NodeRed的灵活流程化编程,破解并处理VRF中央空调的私有485协议,实现与HomeAssistant的无缝本地化集成。文章从协议分析、硬件准备到NodeRed核心流程搭建、数据映射及双向通信控制,提供了一套完整的实战方案,帮助用户将非标设备深度融入智能家居生态,摆脱对厂家云服务的依赖。

weixin_29173777的博客 408

链表java实现

java实现链表,并完成增删改查

qq_42627388的博客 1222

arduino esp8266_Arduino传感器教程 第22章ESP8266 控制 5V 继电器

ESP8266控制5V继电器目录一、NodeMCU二、工作原理本文将使用亚马逊 AlexaEcho 和 ESP8266 控制 5V 继电器。NodeMCUNodeMCU 是一个开源的 IoT 物联网硬件开发板,由于它支持 WIFI 功能且使用方法十分类似 Arduino 开发板,所以近些年获得了越来越多来自全世界的创客朋友们的青睐。NodeMCU 尺寸与 Arduino Nano 类似。...

weixin_39611722的博客 3457

链式编程(Java写法)

在我们编写代码过程中听到过很多说法 如:面向切面编程,函数式编程,面向对象编程,泛式编程等等 接着我来说下链式编程 普通:   1:维护性强   2:对方法的返回类型无要求   3:对程序员的业务要求适中 链式:   1:编程性强   2:可读性强   3:代码简洁   4:对程序员的业务能力要求高   5:不太利于代码调试   在java中String

非淡泊无以明志 非宁静无以致远 2万+

Centos7安装Tesseract5.5.0+SpringBoot集成部署(离线版)

Java 中实现 OCR(光学字符识别)功能,可以使用 Tesseract OCR,这是一个开源的 OCR 引擎,支持多种语言,并且可以在 Java 中通过 Tesseract API 进行集成。

Leopard锋的博客 2320

告别MATLAB!用Python的PYPOWER搞定电力系统潮流计算(附Case30完整代码)

本文介绍了如何从MATLAB迁移到Python,使用PYPOWER工具包进行电力系统潮流计算。通过详细的环境准备、数据接口兼容性实践、潮流计算实现及最优潮流计算进阶,帮助工程师和学生无缝过渡到Python生态。文章还展示了结果处理与可视化技巧,并附有Case30完整代码示例。

weixin_30411819的博客 300

java 双向链表_Java数据结构之链表的原理及LinkedList的部分源码剖析

一、为什么要学习数据结构?做为一名程序员,不管你是用什么编程语言,数据结构是取底层的东西。就相当于盖楼的地基一样,地基做不好,上边再好也没有用。在高级语言中,一般会对这些基础的数据结构进行封装,我们学要学习这些基础的东西吗? 当然是的,只有知道这些基础的东西,我们才能更好地使用语言封装好的api。举个最简单的例子,在Java中,List的实现类有ArrayList,LinkedList,Vecto...

weixin_39603823的博客 135

深入解析Lora模块的工作原理与应用场景

本文深入解析了Lora模块的工作原理与应用场景。Lora模块作为物联网领域的核心无线通信组件,凭借其独特的扩频调制与半双工通信技术,实现了远距离、低功耗的数据传输。文章详细拆解了其技术内核,包括空中唤醒等低功耗奥秘,并提供了地址、信道、空中速率等关键参数的实战配置指南。最后,探讨了Lora模块在智能家居、智慧农业、城市监测等广域物联网场景中的具体应用,为开发者提供了从理论到实践的完整参考。

weixin_29174385的博客 333

Javaweb ajax请求返回数据封装类

Javaweb ajax请求返回数据封装类 package cn.quyi.utils; public class AjaxResult { private boolean success = true; private Integer code = 200; private String message = ""; //返回到前台对象 private Object resultObj; //正确返回 public AjaxResult ok(){

马尾与发圈 373

基于决策树的英雄联盟比赛胜负预测(含完整代码)

在代码中设置随机种子(例如 RANDOM_SEED = 2024)的主要目的是为了确保每次运行代码时,随机过程的结果是一致的。通过绘制不同参数组合下的准确率图,直观地展示了参数对模型性能的影响,帮助读者更好地理解和选择合适的参数。通过设置相同的随机种子(伪随机数),可以确保每次运行代码时,随机数生成器生成的随机数序列是相同的。如果在开发过程中遇到问题,设置固定的随机种子可以帮助你更容易地定位问题,因为每次运行代码时的数据和结果都是一样的。在科学研究和实验中,结果的可重复性是非常重要的。

oisflo的博客 1920

【Proteus仿真】基于74LS148+74LS279+74LS48的四路抢答器

【Proteus仿真】基于74LS148+74LS279+74LS48的四路抢答器

perseverance51博客 8834

数据结构01

数据之间的关系 —— 逻辑结构 是指数据元素之间的相互关系,是我们想象出来的,并没有实质性的将其存储在计算机中 线性结构:一对一的关系 树形结构:一对多的层级关系 图形结构:多对多的关系 关系在计算机上的存储 — 物理结构 是指数据的逻辑结构在计算机中的具体存储形式 顺序存储结构:开辟一组连续的空间存储数据 ​ (通常用数组来实现,数组中空间本身是连续的,保证了数据之间的关系) 链式存储结构:开辟一组随机的空间存储数据 ​ (通常用节点来实现,节点不仅要存储数据还要存储下一个节点的位置以

weixin_53334593的博客 433

Tmux学习总结

Tmux 重要概念 使用 Tmux 的时候千万不要去背指令,所有的指令都可以在 .tmux.conf 配置文件中绑定自己顺手的快捷键,也可以配置开启鼠标。 这个是我的配置文件:https://github.com/zuorn/tmux.conf 在Tmux逻辑中,需要分清楚Server > Session > Window > Pane这个大小和层级顺序是极其重要的,直接关系到工作效率: Server:是整个tmux的后台服务。有时候更改配置不生效,就要使用tmux kill-

满目星辰 579

Java 面向对象综合实战:集合、泛型、Lambda 与 Stream 流实战

前面我们已经完成整套业务实体编码,实现电话卡、三大套餐、能力接口、自定义异常与枚举,并且可以直接运行业务场景做测试。但现在的测试写法是硬编码调用方法,如果业务场景变多,写大量重复代码会很繁琐。本篇我们学习集合、泛型、Lambda 表达式、Stream 流,把多个业务场景封装成任务对象,用集合保存场景,通过 Lambda 封装业务行为,借助 Stream 完成批量执行,让代码更灵活通用。

2302_80198127的博客 173

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

Java 微服务 AI 集成:LangChain4j 与 SpringAI

本文对比了Java生态中两大AI集成框架LangChain4j与SpringAI的核心架构与实战应用。LangChain4j定位为灵活通用的LLM交互框架,支持多模型调用和链式处理;SpringAI则深度集成Spring生态,提供自动化配置和统一客户端抽象。从环境搭建到微服务集成,文章详细展示了两者在智能问答、多轮对话、语义搜索等场景的实现方案,并进行了性能对比与适用场景分析。最后提出了微服务中AI集成的最佳实践,包括性能优化、安全考虑和监控方案,为开发者选择框架提供指导建议。

果酱 の 博客 2185

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

数据结构-链式存储结构(单链表)Java实现

在之前学习了线性表的顺序存储结构之后,我们知道顺序存储结构的优点就是查询和修改速度快,但是它也是有缺点的,那就是插入和删除需要移动大量的元素,显然非常的耗费时间,所以我们就需要学习新的知识来解决这个问题,那就是链式存储结构。顺序存储结构的缺点,恰恰就是链式存储结构的优点。 线性表链式存储结构定义 为了表示每个数据元素ai与其直接后继数据元素ai+1 之间的逻辑关系,对数据元素ai来说,除了存储其本...

master_1997的博客 1409

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

Java数据加密传输实战:基于Hutool实现AES加密与安全通信

数据加密是网络安全的核心基础,其原理是通过特定算法将明文信息转换为无法直接识别的密文,确保数据在传输和存储过程中的机密性。在技术实现上,对称加密算法如AES因其高效性被广泛用于数据加密,而非对称加密如RSA则常用于密钥交换。对于Java开发者而言,直接使用JCE等原生API进行加密操作往往较为复杂。Hutool作为一款高效的Java工具库,极大地简化了加密流程,提供了链式调用等便捷API。在工程实践中,结合AES加密算法,开发者可以快速为Web应用、API接口等场景构建可靠的数据传输安全层,有效防御中间人攻

weixin_30326515的博客 377

java实现串链式存储简单匹配(附带源码)

java实现串链式存储简单匹配(附带源码)

欢迎来到我的博客!这里是一个专注于计算机技术的分享平台,涵盖编程开发、算法研究、系统架构、软件工程等多个领域。无论你是初学者还是资深开发者,都能在这里找到有价值的内容。 1968

java的链式存储结构

首先,我们应该先了解计算机内部的物理存储结构。计算机的主要外存就是软盘和硬盘,现在光说硬盘,硬盘是由一个个盘面组成的,每个盘面上由两个磁头读取数据(正反面)。每个盘面上分为若干个扇区。这里主要用到堆和栈。堆是存储的是数组和对象(其实数组就是对象),凡是new建立的都是在堆中,堆中存放的都是实体(对象),实体用于封装数据,而且是封装多个(实体的多个属性),如果一个数据消失,这个实体也没有消失,还可以...

Fuzz 5302

20260415 java 面试题

单线程处理高并发:它使得单个线程就能高效地监听和处理海量网络连接,无需创建大量线程,从根本上避免了多线程环境下的上下文切换和锁竞争开销。高效的 CPU 利用:主线程大部分时间都在epoll_wait中阻塞等待,不消耗 CPU。只有当连接真正有数据读写时,CPU 才会被唤醒进行处理,实现了 CPU 资源的最大化利用。因此,“内存存储 + 单线程模型 + I/O 多路复用”共同构成了 Redis 高性能的基石。

youz987的博客 441
上一篇: 【JAVA】线性表的数组实现
下一篇: 【JAVA】输入一个链表,输出该链表中倒数第k个结点。
寻爻青年
博客等级 码龄8年 27粉丝 137原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

寻爻青年

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值