【java】通过<类与对象> 引入-> 链表

目录

链表

碎片化:

内存碎片产生的原因

如何避免内存碎片?

链表类型

单链表

双链表

单循环链表

双循环链表

java是如何创建链表的?

类与对象

类是什么?

什么是对象?

构建链表

头指针

简画内存图:

 ​编辑

尾插法 

头插法

输出链表的长度

输出链表的值


链表

为什么会有链表?

        目的是为了解决碎片化空间的利用。

数组本质上是一块连续的空间,链表是不连续的。


碎片化:

        内存碎片是指已经分配的内存块之间出现未被利用的空间,这种空间会导致内存利用率降低,从而影响系统的性能和稳定性。


内存碎片产生的原因

主要有以下几种:

  • 频繁的内存分配和释放:由于内存分配和释放不均衡,容易导致一些小的碎片
  • 不同大小的内存分配:当系统中分配的内存大小不一致时,也会导致碎片
  • 内存对齐的问题:当内存分配时没有对齐,也会导致碎片

如何避免内存碎片?

可以采用以下策略:

  1. 内存池:使用内存池可以减少频繁的内存分配和释放,从而避免碎片的产生。
  2. 统一内存分配方式:使用相同的内存分配方式可以避免不同大小的内存分配。
  3. 对齐内存分配:通过对齐内存分配,可以减少内存碎片的产生。
  4. 使用内存压缩算法:内存压缩算法可以将内存中的碎片进行整理,从而减少碎片。
  5. 避免内存泄漏:内存泄漏会导致一些内存无法释放,也会导致碎片的产生。

链表类型

单链表

双链表

单循环链表

双循环链表


java是如何创建链表的?

以单链表为例:

节点:

那么首先我们面对着一个问题,- - Java是怎么创建节点的。

 java是有原生的数组结构

int[] arr=new int[5]; //内存就会开辟相应的内存空间。这就是所说的原生的数组结构。

但是java没有原生的链表结构。

java能采用对象的形式来创建节点。


类与对象

类是什么?
  • 对象:对象是类的一个实例(对象不是找个女朋友),有数据和方法。例如,一条狗是一个对象,它的状态有:颜色、名字、品种;行为有:摇尾巴、叫、吃等。
  • :类是一个模板,它描述一类对象的数据和方法。

创建java程序第一步必须创建一个类 class

编译:把 .java 文件编译成 .class 文件

运行:

        源代码                         二进制字节码文件

运行任何一个程序,在CPU(数据处理器)运行。

CPU  处理数据需要 0.2ns

磁盘 当中,查找数据需要  3-5ms.

1ms=1x10^6 ns

CPU就有大量的空闲。

磁盘中的文件想运行,优先进入内存,内存 查找数据 20 ns

磁盘会把数据扔到内存当中,

内存里的是程序,

内存会给正在运行的程序--进程开辟内存空间目的是存储数据,给CPU进行交互。

内存会给java运行的程序开辟空间:

方法区 存储 类信息。

存储 对象。

虚拟机栈 控制 程序的执行。

.class文件 被加载到方法区,之后 main方法 入栈。

什么是对象?

        对象是 堆 里的一块内存空间--->存储数据和方法

Student s1=new Student();

new         本身是java的一个关键字,功能就是要求在堆里开辟内存空间。

Student() ; 构造器,创建对象的时候给对象当中的数据赋初始值。

s1          对象的名称

Student 对象的类型---->决定在内存当中的存储形式。

默认任何一个类当中都有一个不显示的无参数构造器。

但是一旦你显示的创建出构造,那么那个不显示的构造器就会被覆盖!!!

 

构建链表
public class Node{public int data;public Node next;public Node(int value){data=value;    }
}

Node:  数据类型--->  数据类型来定义数据在内存当中的形式。

int a=10;            int: 1bit (符号位) 31bit (数值位)

byte a=10;         byte: 1bit (符号位) 7bit数值位

float a=10.0;      float:1 bit(符号位) 8bit 阶位 23bit数值位


Node node=new Node(5);

Node node=new Node();

在内存中形式一样。

类的实例,有属性和方法


 java当中,等号是赋值操作,将等号后边的值(引用数据类型指向的是地址) 赋给 前边的变量。

node1.next=node2;

内存图解释: 

 

这种方法创建链表难。

一般建一个类构建链表。

public class LinkedList{public void EndInsert(int val){}
}
头指针

           --节点一定是对象

传参只需要传head就行,因为head指向下一个节点,下一个节点指向下一个节点。

public class LinkedList{Node head=null;public void EndInsert(int val){//创建新节点Node newNode=new Node(val);//判断头指针指向为空,那么头指针指向第一个节点if(head==null){head=newNode;return ;     //必须写,不然得陷入死循环   }    Node preNode=head;while(preNode.next!=null){preNode=preNode.next;        }preNode.next=newNode;}
}
public class Test{public static void main(String[] args){LinkedList linkedlist=new Linkedlist();linkedList.EndInsert(1);  linkedList.EndInsert(2); linkedList.EndInsert(3); linkedList.EndInsert(4);   }
}
简画内存图:
 

尾插法 

将当前节点插入到链表的尾部。

游标,指针。

读代码就是读内存图示

代码见上。

public class LinkedList{Node head=null;public void EndInsert(int val){//创建新节点Node newNode=new Node(val);//判断头指针指向为空,那么头指针指向第一个节点if(head==null){head=newNode;return ;     //必须写,不然得陷入死循环   }    Node preNode=head;while(preNode.next!=null){preNode=preNode.next;        }preNode.next=newNode;}
}

头插法
public class LinkedList{Node head=null;public void  HeadInsert(int val){//创建新节点Node newNode=new Node(val);//判断头指针指向为空,那么头指针指向第一个节点if(head==null){head=newNode;return ;     //必须写,不然得陷入死循环   }    newNode.next=head;head=newNode;}
}
输出链表的长度
//输出链表的长度public int Length() {Node flag=head;int count=0;while(flag!=null) {count++;flag=flag.next;}return count;}
输出链表的值
 //输出链表值public void Value() {Node flag=head;System.out.print("[");while(flag!=null) {System.out.print(flag.data);if(flag.next!=null) {System.out.print(",");}elseSystem.out.println("]");flag=flag.next;}}

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

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

相关文章

微软开源5级Agent框架,复杂任务就这么被解决了~

微软又来卷Agent,开源了解决复杂任务的通用Multi-Agent框架Magentic-One,它旨在解决开放性的网络和基于文件的任务,跨越各种领域,如操作网络浏览器、导航本地文件、编写和执行Python代码、做市场调研、写论文等等。 Magentic-One…

矩阵中的路径(dfs)-acwing

题目 23. 矩阵中的路径 - AcWing题库 代码 class Solution { public://以每一个坐标作为dfs起点bool hasPath(vector<vector<char>>& matrix, string str) {for (int i 0; i < matrix.size(); i )for (int j 0; j < matrix[i].size(); j )if (dfs(…

欢迎 Stable Diffusion 3.5 Large 加入 Diffusers

作为Stable Diffusion 3的改进版本&#xff0c;Stable Diffusion 3.5 如今已在 Hugging Face Hub 中可用&#xff0c;并可以直接使用 &#x1f9e8; Diffusers 中的代码运行。 https://hf.co/blog/sd3 本次发布包含两套模型参数: https://hf.co/collections/stabilityai/stable…

Docker入门系列——DockerFile的使用

前面了解了Docker的基本概念&#xff0c;今天来认识一下DockerFile。 Dockerfile 是一个文本文件&#xff0c;包含一系列指令来组装 Docker 镜像。每个指令执行一个特定动作&#xff0c;例如安装包、复制文件或定义启动命令。正确使用 Dockerfile 指令对于构建高效容器至关重要…

2-146 基于matlab的双摆杆系统建模分析

基于matlab的双摆杆系统建模分析。连接方式为铰接&#xff0c;两杆均视为均质杆&#xff0c;动态输出摆杆末端轨迹。程序已调通&#xff0c;可直接运行。 下载源程序请点链接&#xff1a;2-146 基于matlab的双摆杆系统建模分析

基于java+SpringBoot+Vue的美发门店管理系统设计与实现

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; Springboot mybatis Maven mysql5.7或8.0等等组成&#x…

基于vue框架的的楼盘销售管理系统6n60a(程序+源码+数据库+调试部署+开发环境)系统界面在最后面。

系统程序文件列表 用户,房源类型,员工,房源信息,购房预订,购房合同 开题报告内容 基于Vue框架的楼盘销售管理系统开题报告 一、研究背景 随着房地产市场的蓬勃发展&#xff0c;楼盘销售行业的竞争日益激烈。传统的销售管理方式依赖于人工记录和纸质文档&#xff0c;效率低下…

值得一看的小模型技术全面总结及RAG文档处理及切分小模型工具

、 本文还是来看看RAG&#xff0c;不过是从另一个角度&#xff0c;从小模型(其实这个小不太好说&#xff0c;7B或者以下&#xff1f;)角度&#xff1b; 因此&#xff0c;讲两件事&#xff0c;一个是回顾下小模型&#xff0c;推荐一个写的很好的小模型进展技术总结综述&#xf…

大模型好书案例——《BERT基础教程:Transformer大模型实战》(附PDF)

《BERT基础教程&#xff1a;Transformer大模型实战》是一本关于自然语言处理&#xff08;NLP&#xff09;的书籍&#xff0c;专注于谷歌公司开发的BERT模型。这本书由印度作者苏达哈尔桑拉维昌迪兰&#xff08;Sudharsan Ravichandiran&#xff09;撰写&#xff0c;周参翻译。 …

关于Markdown的一点疑问,为什么很多人说markdown比word好用?

markdown和word压根不是一类工具&#xff0c;不存在谁比谁好&#xff0c;只是应用场景不一样。 你写博客、写readme肯定得markdown&#xff0c;但写合同、写简历肯定word更合适。 markdown和word类似邮箱和微信的关系&#xff0c;这两者都可以通信&#xff0c;但微信因为功能…

ASR 点屏

ASR翱捷科技 ASR kernel 5.10 android14 ASR EVB平台 以gc7202 jd9365这两块屏为例 新旧DTBO点屏配置是有区别的,主要差异是体现在 asr\kernel\u-boot\board\asr\dove\dovc.c这个文件上 旧DTBO: 新DTBO: 目前我们的代码已经合入新的DTBO 以前在没有合入asr新的DTBO时点亮…

Ubuntu24.04网络异常与应对方案记录

PS: 参加过408改卷的ZJU ghsongzju.edu.cn 开启嘲讽: 你们知道408有多简单吗&#xff0c;操作系统真实水平自己知道就行&#xff5e;&#xff5e; Requested credits of master in UWSC30&#xff0c;in ZJU24&#xff0c;domestic master is too simple dmesg dmesg 是一个用…

【Zynq FPGA】基于 Zynq FPGA 的雷龙 SD NAND 测试

对于芯片正常读写的测试结果&#xff0c;还是很让人满意的&#xff0c;芯片的价格也很合理。并且LGA-8封装更适合无卡槽的嵌入式开发板设计&#xff0c;在一定的应用领域有着简化硬件设计、减小硬件面积的功能。贴上测试工程的链接&#xff0c;还迎复现实验: https://gitee.com…

【PyTorch][chapter31][transformer-5] MQA,CQA, GQA

前言&#xff1a; Trans 翻译 《Variants of Multi-head attention: Multi-query (MQA) and Grouped-query attention (GQA) 为例兼顾性能,和模型的效率Google 又陆续提出了三种注意力架构. 当一个模型训练过度时&#xff0c;它会过度拟合或记忆训练数据&#xff0c;从而降低…

数据结构之排序--选择排序详解

选择排序 每一次从待排序的数据元素中选出最小&#xff08;或最大&#xff09;的一个元素&#xff0c;存放在序列的起始位置&#xff0c;直到全部待排序的数据元素排完 。 直接选择排序: 在元素集合 array[i]--array[n-1] 中选择关键码最大 ( 小 ) 的数据元素 若它不是这组元…

spring组件介绍

1. Spring Core&#xff08;Spring核心&#xff09;&#xff1a; • BeanFactory&#xff1a;Spring IoC容器的基础接口&#xff0c;提供了配置框架和基本的功能&#xff0c;用于管理任何类型的对象。 • ApplicationContext&#xff1a;BeanFactory的子接口&#xff0c;提供了…

软件测试基础:单元测试与集成测试

单元测试的重要性 单元测试是软件开发过程中的必要步骤。它通过针对软件的最小可测试单元进行测试&#xff0c;可以及早发现代码中的逻辑错误和缺陷。根据统计数据显示&#xff0c;单元测试可以在软件开发初期就发现约70%的错误&#xff0c;从而减少了后期修改的成本和时间消耗…

sql专题 之 常用命令

文章目录 查询基础语法查询全表查询选择查询&#xff1a;常量和运算&#xff1a; 条件查询where运算符&#xff1a;、 !、<、>空值&#xff1a;null模糊查询&#xff1a;like逻辑运算&#xff1a;and or not 去重&#xff1a;distinct排序&#xff1a;order by截断和偏移…

LocalSend:开源跨平台文件传输工具,让设备互通无阻

在现代社会中&#xff0c;文件共享和设备之间的互联互通已经成为日常生活中不可或缺的一部分。无论是在工作中分享文档&#xff0c;还是在朋友间传输照片和视频&#xff0c;快速而便捷的文件传输工具都显得尤为重要。通常情况下&#xff0c;我们依赖互联网或蓝牙进行文件传输&a…

解决 Vue3、Vite 和 TypeScript 开发环境下跨域的问题,实现前后端数据传递

引言 本文介绍如何在开发环境下解决 Vite 前端&#xff08;端口 3000&#xff09;和后端&#xff08;端口 80&#xff09;之间的跨域问题&#xff1a; 在开发环境中&#xff0c;前端使用的 Vite 端口与后端端口不一致&#xff0c;会产生跨域错误提示&#xff1a; Access to X…