首页 > 编程语言 >【java】通过<类与对象> 引入-> 链表

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

时间:2024-11-10 09:16:36浏览次数:3  
标签:Node head java next 链表 内存 引入 public

目录

链表

碎片化:

内存碎片产生的原因

如何避免内存碎片?

链表类型

单链表

双链表

单循环链表

双循环链表

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(",");
	    		}else
	    			System.out.println("]");
	    		flag=flag.next;
	    	}
	    	
	    }

标签:Node,head,java,next,链表,内存,引入,public
From: https://blog.csdn.net/m0_75163045/article/details/143655278

相关文章

  • java-文件分割
    packagesplit;importjava.io.BufferedOutputStream;importjava.io.FileOutputStream;importjava.io.IOException;importjava.io.RandomAccessFile;importjava.io.File;publicclassSplit{publicstaticvoidmain(String[]args)throwsIOException{......
  • java-文件编码
    packagecode;importjava.io.FileOutputStream;importjava.nio.file.Files;importjava.nio.file.Path;importjava.nio.file.Paths;importjava.util.*;publicclassOperation{privatestaticList<Reconstitution>sort;privatestaticbyte[]......
  • java-文件解码
    packageback;importjava.io.BufferedReader;importjava.io.FileInputStream;importjava.io.FileOutputStream;importjava.io.InputStreamReader;importjava.util.HashMap;importjava.util.Map;publicclassBack{publicstaticvoidmain(String[]arg......
  • java-文件合并
    packagemerge;importjava.io.BufferedOutputStream;importjava.io.File;importjava.io.FileOutputStream;importjava.nio.file.Files;importjava.nio.file.Path;importjava.nio.file.Paths;importjava.util.ArrayList;publicclassMerge{publicstat......
  • Java期末复习暨学校第二次上机课作业
    Java期末复习暨学校第二次上机课作业:了解程序的控制结构,掌握顺序结构程序的设计方法,掌握分支程序设计方法。第一题:闰年有两种判断方式:(1):能被4整除但不能被100整除(2):能被400整除输出结果:第二题:一个三位数求和,分别先把百位、十位、个位的数求出来再相加。百位:用给出......
  • 新手入门Java自动化测试的利器:Selenium WebDriver
    今天我们将深入探讨一款强大的Java自动化测试工具——SeleniumWebDriver。在正式介绍SeleniumWebDriver之前,让我们首先对Selenium本身进行简要概述,以便更好地理解其背景和功能。官方学习网站:https://www.selenium.dev/Selenium是一个开源的自动化测试框架,WebDriver是其核心......
  • 华为OD机试2024年E卷-MVP争夺战[100分]( Java | Python3 | C++ | C语言 | JsNode | Go
    题目描述在星球争霸篮球赛对抗赛中,最大的宇宙战队希望每个人都能拿到MVP,MVP的条件是单场最高分得分获得者。可以并列所以宇宙战队决定在比赛中尽可能让更多队员上场,并且让所有得分的选手得分都相同,然而比赛过程中的每1分钟的得分都只能由某一个人包揽。输入描述输入第一行......
  • 华为OD机试2024年E卷-AI识别面板[100分]( Java | Python3 | C++ | C语言 | JsNode | Go
    题目描述AI识别到面板上有N(1≤N≤100)个指示灯,灯大小一样,任意两个之间无重叠。由于AI识别误差,每次别到的指示灯位置可能有差异,以4个坐标值描述AI识别的指示灯的大小和位置(左上角x1,y1,右下角x2,y2),请输出先行后列排序的指示灯的编号,排序规则:每次在尚未排序的灯中挑选最高的......
  • 深入理解 Java 反射与泛型:类型擦除与强制类型转换
    深入理解Java反射与泛型:类型擦除与强制类型转换在Java编程中,反射(Reflection)和泛型(Generics)是两个强大且常用的特性。反射允许我们在运行时检查和操作类、方法、字段等,而泛型则允许我们编写更加通用和类型安全的代码。然而,Java的泛型机制与类型擦除(TypeErasure)密切相关,这使......
  • [Javaee]网络原理-https协议
    前言前面的文章,我们着重介绍了http协议相关的知识。【Javaee】网络原理—http协议(一)-CSDN博客【Javaee】网络原理-http协议(二)-CSDN博客http存在着安全问题(如运营商劫持),针对http的安全问题,我们引入了https进行解决。下面,将详细介绍https协议目录 一.https协议是什么......