JVM:字节码文件,类的生命周期,类加载器

news2024/9/28 3:29:02

JVM:字节码文件,类的生命周期,类加载器

  • = = = = = = = = = = = = = = = = 为什么要学这门课程 = = = = = = = = = = = = = = = =
  • 1. 初识JVM
    • 1.1. 什么是JVM
    • 1.2. JVM的功能
    • 1.3. 常见的JVM
  • 2. 字节码文件详解
    • 2.1. Java虚拟机的组成
    • 2.2. 字节码文件的组成
      • 2.2.1. 以正确的姿势打开文件
      • 2.2.2. 字节码文件的组成
        • 2.2.2.1 基本信息
        • 2.2.2.2 常量池
      • 2.2.3. 玩转字节码常用工具
    • 2.3. 类的生命周期
    • 2.4. 类加载器
      • 2.4.1. 类加载器的分类
      • 2.4.2. 双亲委派机制
      • 2.4.3. 打破双亲委派机制
        • 2.4.3.1. 自定义类加载器
        • 2.4.3.2. 线程上下文类加载器
        • 2.4.3.3. Osgi框架的类加载器(了解即可)
      • 2.4.4. jDK9之后的类加载器

在这里插入图片描述

在这里插入图片描述

JAVA虚拟机属于java的核心特性。

= = = = = = = = = = = = = = = = 为什么要学这门课程 = = = = = = = = = = = = = = = =

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
课程安排
在这里插入图片描述

在这里插入图片描述

1. 初识JVM

1.1. 什么是JVM

JVM全称是Java Virtual Machine,中文译名Java虚拟机。

在这里插入图片描述

在这里插入图片描述

1.2. JVM的功能

在这里插入图片描述
在这里插入图片描述
虽然需要解释,不如C与C++。但是JAVA支持 跨平台

由于JVM需要实时解释虚拟机指令,不做任何优化性能不如直接运行机器码的C、C++等语言。

即时编译

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

1.3. 常见的JVM

名称作者支持版本社区活跃度(github star)特性适用场景
HotSpot(Oracle JDK版)Oracle所有版本高(闭源)使用最广泛,稳定可靠,社区活跃 JIT支持 Oracle JDK默认虚拟机默认
HotSpot(Open jDK版)Oracle所有版本中(16.1k)同上 开源,Open jDK默认虚拟机默认 对JDK有二次开发需求
GraalVMOracle11, 17,19企业版支持8高(18.7k)多语言支持高性能、JIT、 AOT支持微服务、云原生架构 需要多语言混合编程
Dragonwell jDK 龙井Alibaba标准版8,11,17 扩展版11,17低(3.9k)基于OpenjDK的增强 高性能、bug修复、安全性提升 JWarmup、ElasticHeap、 Wisp特性支持电商、物流、金融领域对性能要求比较高
Eclipse OpenJ9(原IBM J9)IBM8,11,17,19,20低(3.1k)高性能、可扩展JIT、AOT特性支持微服务、云原生架构
  • 《Java虚 拟机规范》由Oracle制定,内容主要包含了Java虚拟机在设计和实现时需要遵守的规范,主要包含class字节码文件的定义、类和接口的加载和初始化、指令集等内容。
  • 《Java虚拟机规范 》是对虚拟机设计的要求,而不是对Java设计的要求,也就是说虚拟机可以运行在其他的语言比如Groovy、Scala生成的class字节码文件之上。

在这里插入图片描述

C:\Users\HP>java -version
java version "19.0.2" 2023-01-17
Java(TM) SE Runtime Environment (build 19.0.2+7-44)
Java HotSpot(TM) 64-Bit Server VM (build 19.0.2+7-44, mixed mode, sharing)

对于HotSpot(Oracle JDK版) 最常用,以它为主要内容讲解!!

在这里插入图片描述

在这里插入图片描述

2. 字节码文件详解

2.1. Java虚拟机的组成

我现在编译了一个字节码文件
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

2.2. 字节码文件的组成

java虚拟机已经把字节码 加载与执行都处理完了,那还学什么!

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

2.2.1. 以正确的姿势打开文件

字节码文件中保存了源代码编译之后的内容,以二进制的方式存储,无法直接用记事本打开阅读。
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2.2.2. 字节码文件的组成

2.2.2.1 基本信息

在这里插入图片描述
在这里插入图片描述
文件是无法通过文件扩展名来确定文件类型的,文件扩展名可以随意修改,不影响文件的内容。
软件使用文件的头几个字节(文件头)去校验文件的类型,如果软件不支持该种类型就会出错。

文件类型字节数文件头
JPEG (ipg)3FFD8FF
PNG (png)489504E47 (文件尾也有要求)
bmp2424D
XML (xml)53C3F786D6C
AVI (avi)441 564920
Java字节码文件(.class)4CAFEBABE

在这里插入图片描述

在这里插入图片描述
版本号的作用主要是判断当前字节码的版本和运行时的JDK是否兼容

比如:

在这里插入图片描述
在这里插入图片描述

两种方案:

  1. 升级JDK版本(容易引发其他的兼容性问题,并且需要大量的测试)
  2. 将第三方依赖的版本号降低或者更换依赖,以满足JDK版本的要求 建议采用

在这里插入图片描述

名称作用
Magic魔数固定为0xCAFEBABE,不会改变
主版本号、副版本号编译字节码文件的JDK版本
访问标识标识是类还是接口、注解、枚举、模块标识public final abstract
类、父类、接口索引通过这些索引可以找到类、父类、接口的信息
2.2.2.2 常量池

保存了字符串常量、类或接口名、字段名主要在字节码指令中使用

字节码文件中常量池的作用:避免相同的内容重复定义,节省空间。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
名字也是常量,内容如果不一样就按常规方法存,但是名字和内容一样,其实常量池中已经有这个常量了,常量池中一般不重复,所以不用中转。

名字也作为一个值来储存,比如A = “abc” 什么以上 在一个地址 地址里面存了A 另外一个地址存"abc" 这需要2个地址 如果abc = “abc” 那么 abc 直接就存在那个地址里面
在这里插入图片描述

●字节码中的方法区 域是存放字节码指令的核心位置,字节码指令的内容存放在方法的Code属性中。

我们打开字节码文件

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
注意 : 对于iload_1这个 是把数值复制了一份 而不是删掉

public class Demo1 {
    public static void main(String[] args) {
        int i = 0;
        i =i++;
        System.out.println(i); //0
    }
}

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

答案是0,我通过分析字节码指令发现,i+ +先把0取出来放入临时的操作数栈中,接下来对i进行加1,i变成了1,最后再将之前保存的临时值0放入i,最后i就变成了0。

在这里插入图片描述

2.2.3. 玩转字节码常用工具

在这里插入图片描述

在这里插入图片描述
在IDEA安装插件!

build——recompile

必须选择自己的文件 且查看最新的要重新编译!

如果我们的程序已经在运行中,我们可不可以查看字节码文件

在这里插入图片描述

在这里插入图片描述

  • dump类的全限定名: dump已加载类的字节码文件到特定目录。
  • jad类的全限定名:反编译已加载类的源码。

在这里插入图片描述

在这里插入图片描述

2.3. 类的生命周期

类的生命周期描述了一个类加载、使用、卸载的整个过程

在这里插入图片描述
对于使用来说 我们最熟悉——new 或者反射等。

有的可能分的比较细,7个阶段,是因为把连接拆成了验证、准备、和解析。

加载阶段:

  1. 加载(Loading)阶段第一步是类加载器根据类的全限定名通过不同的渠道以二进制流的方式获取字节码信息。

不同渠道是什么?
在这里插入图片描述

  1. 类加载器在加载完类之后,Java虚拟机会将字节码中的信息保存到方法区中。

  2. 类加载器在加载完类之后, Java虚拟机会将字节码中的信息保存到内存的方法区中。
    生成一个InstanceKlass对象,保存类的所有信息,里边还包含实现特定功能比如多态的信息。

在这里插入图片描述

  1. 同时,Java虚拟机还会在堆中生成一份与方法区中数据类似的java.lang.Class对象。
    作用是在Java代码中去获取类的信息以及存储静态字段的数据(JDK8及之后)。

在这里插入图片描述

推荐使用JDK自带的hsdb工具查看Java虚拟机内存信息。工具位于JDK安装目录下lib文件夹中的sa-jdijar中。

java -cp sa-jdi.jar sun.jvm.hotspot.HSDB

在这里插入图片描述

连接阶段:
在这里插入图片描述
连接阶段——验证

验证的主要目的是检测Java字节码文件是否遵守了《Java虚拟机规范》中的约束。这个阶段一般不需要程序员参与。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

主版本号不能高于运行环境主版本号,如果主版本号相等,副版本号也不能超过。

连接阶段——准备阶段:

●准备阶段为静态变量(static) 分配内存并设置初始值。
●注意:本章涉及到的内存结构只讨论JDK8及之后的版本,8之前的版本后续章节详述。

在这里插入图片描述
在这里插入图片描述
为什么要默认值?

在这里插入图片描述
但是!final 修饰呢?又是另外一种情况!
这个例子就说明,他没有赋值初值为 0 的过程!

在这里插入图片描述
连接阶段——解析阶段:

●解析阶段主要是将常量池中的符号引用替换为直接引用。
符号引用就是在字节码文件中使用编号来访问常量池中的内容。

在这里插入图片描述

在这里插入图片描述

初始化阶段

●初始化阶段会执行静态代码块中的代码,并为静态变量赋值。
●初始化阶段会执行字节码文件中clinit部分的字节码指令。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
以下几种方式会导致类的初始化:

  1. 访问一个类的静态变量或者静态方法,注意变量是final修饰的并且等号右边是常量不会触发初始化。
  2. 调用Class.forName(String className)。
  3. new一个该类的对象时。
  4. 执行Main方法的当前类。

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

第二个测试用例
在这里插入图片描述
结果打印:初始化了…
在这里插入图片描述
第三个测试用例

在这里插入图片描述
我们找到main所在的类:Demo5 初始化! 然后用到了new Demo6 初始化6
在这里插入图片描述
好!我们现在看看这两道大题能不能轻松拿下!
在这里插入图片描述

public class Demo1 {
    public static void main(String[] args) {
        System.out.println("A");
        new Demo1();
        new Demo1();
    }
    public Demo1(){
        System.out.println("B");
    }
    {
        System.out.println("C");
    }
    static {
        System.out.println("D");
    }
}

DACBCB
因为实例代码块会在构造方法之前执行

类的生命周期初始化阶段

clinit指令 在特定情况下不会出现,比如:如下几种情况是不会进行初始化指令执行的。
1.无静态代码块且无静态变量赋值语句。
2.有静态变量的声明,但是没有赋值语句。
3.静态变量的定义使用final关键字,这类变量会在准备阶段直接进行初始化。

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2.4. 类加载器

类加载器(ClassLoader)是Java虚拟机提供给应用程序去实现获取类和接口字节码数据的技术。

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

2.4.1. 类加载器的分类

类载器分为两类

  • Java代码中实现
  • Java虚拟机底层源码实现

在这里插入图片描述

类加载器的设计JDK8和8之后的版本差别较大,JDK8及之前的版本中默认的类加载器有如下几种:

在这里插入图片描述
类加载器的分类启动类加载器

●启动类加载器(Bootstrap ClassLoader)是由Hotspot虚拟机提供的、使用C+ +编写的类加载器。
●默认加载Java安装目录/jre/lib下的类文件,比如rt.jar,tools.jar, resources.jar等。

通过启动类加载器去加载用户jar包:

  • 放入jre/lib下进行扩展
    • 不推荐,尽可能不要去更改JDK安装目录中的内容,会出现即时放进去由于文件名不匹配的问题也不会正常地被加载
  • 使用参数进行扩展
    • 推荐,使用-Xbootclasspath/a:jar包目录/jar包名进行扩展

在这里插入图片描述

类加载器的分类默认类加载器

●扩展类加载器和应用程序类加载器都是JDK中提供的、 使用Java编写的类加载器。

●它们的源码都位于sun.misc.Launcher中, 是一个静态内部类。继承自URLClassLoader。 具备通过目录或者指定jar包将字节码文件加载到内存中。

在这里插入图片描述
通过扩展类加载器去加载用户jar包:

  • 放入/jre/lib/ext下进行扩展
    • 不推荐,尽可能不要去更改JDK安装目录中的内容
  • 使用参数进行扩展
    • 推荐,使用-Djava.ext.dirs=jar包目录 进行扩展,这种方式会覆盖掉原始目录,可以用;(windows):(macos/linux)追加上原始目录

类加载器的分类应用程序类加载器

在这里插入图片描述
验证一下:
在这里插入图片描述

在这里插入图片描述

2.4.2. 双亲委派机制

在这里插入图片描述

双亲委派机制有什么用!

  1. 保证类加载的安全性
    • 通过双亲委派机制避免恶意代码替换JDK中的核心类库,比如java.lang.String,确保核心类库的完整性和安全性。
  2. 避免重复加载
    • 双亲委派机制可以避免同一个类被多次加载。

双亲委派机制指的是:当一个类加载器接收到加载类的任务时,会自底向上查找是否加载过,再由顶向下进行加载。

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
我们可以在代码中展示一下这个类:

首先,在Java中如何使用代码的方式去主动加载一个类呢?

  • 方式1:使用Class.forName方法,使用当前类的类加载器去加载指定的类。
  • 方式2:获取到类加载器,通过类加载器的loadClass方法指定某个类加载器加载。
    例如:
    在这里插入图片描述
  • 应用程序类加载器的parent父类加载器是扩展类加载器,而扩展类加载器的parent是空,但是在代码逻辑上,扩展类加载器依然会把启动类加载器当成父类加载器处理。
  • 启动类加载器使用C++编写,没有父类加载器。

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

2.4.3. 打破双亲委派机制

虽然说,我们的双亲委派机制很牛!但是我们在一些情况下,我们需要打破这个机制才能实现我们想要的功能。

2.4.3.1. 自定义类加载器
  • 自定义类加载器并且重写loadClass方法,就可以将双亲委派机制的代码去除

  • Tomcat通过这种方式实现应用之间类隔离,《面试篇》 中分享它的做法

  • 一个Tomcat程序中是可以运行多个Web应用的,如果这两个应用中出现了相同限定名的类,比如Servlet类,Tomcat要保证这两个类都能加载并且它们应该是不同的类。

  • 如果不打破双亲委派机制,当应用类加载器加载Web应用1中的MyServlet之后,Web应用2中相同限定名的MyServlet类就无法被加载了。
    在这里插入图片描述

在这里插入图片描述

  • 先来分析ClassLoader的原理 ,ClassLoader中包含 了4个核心方法。
  • 双亲委派机制的核心代码就位于loadClass方法中。
public Class<?> loadClass(String name)
protected Class<?> findClass(String name)
protected final Class<?> defineClass(String name, byte[] b, int off, int len)
protected final void resolveClass(Class<?> c)

在这里插入图片描述
在这里插入图片描述

2.4.3.2. 线程上下文类加载器
  • 利用上下文类加载器加载类,比如JDBC和JNDI等
    在这里插入图片描述

spi全称为(Service Provider Interface),是JDK内置的一种服务提供发现机制。
spi的工作原理:

在这里插入图片描述

  1. 在ClassPath路径下的META-INF/services文件夹中,以接口的全限定名来命名文件名, 对应的文件里面写该接口的实现。
  2. 使用ServiceLoader加载实现类。
    在这里插入图片描述
2.4.3.3. Osgi框架的类加载器(了解即可)
  • 历史上0sgi框架实现了一套新的类加载器机制,允许同级之间委托进行类的加载

在这里插入图片描述

2.4.4. jDK9之后的类加载器

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

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

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

相关文章

电脑软件:推荐一款非常实用的固态硬盘优化工具

目录 一、软件简介 二、工作原理 三、功能介绍 3.1、优化SSD设置 3.2、查看驱动器信息 3.3、查看SMART数据 3.4、停用Windows事件日志记录 3.5、禁用Windows碎片整理 3.6、时间戳停用 3.7、禁用引导文件的碎片整理 3.8、关闭短名称 四、使用教程 4.1 安装说明 4.…

OpenCV图像处理、计算机视觉实战应用

OpenCV图像处理、计算机视觉实战应用 专栏简介一、基于差异模型模板匹配缺陷检测二、基于NCC多角度多目标匹配三、基于zxing多二维码识别四、基于tesseract OCR字符识别 专栏简介 基于OpenCV C分享一些图像处理、计算机视觉实战项目。不定期持续更新&#xff0c;干货满满&…

[C/C++]数据结构 链表(单向链表,双向链表)

前言: 上一文中我们介绍了顺序表的特点及实现,但是顺序表由于每次扩容都是呈二倍增长(扩容大小是自己定义的),可能会造成空间的大量浪费,但是链表却可以解决这个问题. 概念及结构: 链表是一种物理存储结构上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接…

【自用总结】正项级数审敛法的总结

注&#xff1a;收敛半径的求法就是lim n->∞ |an1/an| ρ&#xff0c;而ρ1/R&#xff0c;最基本的不能忘。 比较判别法&#xff1a;从某项起&#xff0c;该级数后面的项均小于等于另一级数&#xff0c;则敛散性可进行一定的比较 可以看到&#xff0c;比较判别法实际上比较…

跟我一起来做一个音视频产品功能!

前言&#xff1a; 大家好&#xff0c;上来和大家汇报一下h264翻译进度&#xff0c;目前翻译完了第六章&#xff0c;第七章快翻译完了&#xff0c;马上可以翻译第八章。 在第七章翻译完了之后&#xff0c;我会做一个知识点总结出来&#xff0c;一起学习&#xff0c;一起进步&…

Android 13.0 Launcher3仿ios长按app图标实现抖动动画开始拖拽停止动画

1.概述 在13.0的系统rom定制化开发中,在对系统原生Launcher3的定制需求中,也有好多功能定制的,在ios等电子产品中 的一些好用的功能,也是可以被拿来借用的,所以在最近的产品开发需求中,需求要求模仿ios的 功能实现长按app图标实现抖动动画,接下来看如何分析该功能的实现…

【开源】基于JAVA的校园失物招领管理系统

项目编号&#xff1a; S 006 &#xff0c;文末获取源码。 \color{red}{项目编号&#xff1a;S006&#xff0c;文末获取源码。} 项目编号&#xff1a;S006&#xff0c;文末获取源码。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、研究内容2.1 招领管理模块2.2 寻物管理模块2.3 系…

主键问题以及分布式 id

分布式 id 需要处理的问题主要是同一时间在多台机器中保证生成的 id 唯一&#xff0c;为了这么做我们可以这么做&#xff1a; 分布式 id 生成策略 先说几个已经被淘汰的策略引出分布式 id 的问题 1&#xff0c;UUID&#xff1a;UUID 随机并且唯一&#xff0c;在单一的数据库…

调整COSWriter解决X-easypdf / PDFBOX生成大量数据时OOM问题

背景 业务需要生成一个15W数据左右的PDF交易报表。希望我们写在一个文件里&#xff0c;不拆分成多个PDF文件。 使用的技术组件 <dependency><groupId>wiki.xsx</groupId><artifactId>x-easypdf-pdfbox</artifactId><version>2.11.10<…

基于和声算法优化概率神经网络PNN的分类预测 - 附代码

基于和声算法优化概率神经网络PNN的分类预测 - 附代码 文章目录 基于和声算法优化概率神经网络PNN的分类预测 - 附代码1.PNN网络概述2.变压器故障诊街系统相关背景2.1 模型建立 3.基于和声优化的PNN网络5.测试结果6.参考文献7.Matlab代码 摘要&#xff1a;针对PNN神经网络的光滑…

IPSecGRE

IPSec&GRE 手工方式建立IPSec隧道组网实验拓扑配置步骤第一步配置IP地址第二步配置静态路由第三步配置IPSec 抓包测试 GRE Over IPSec功能的配置组网实验拓扑配置命令 配置GRE使用静态路由组网图实验拓扑配置步骤1.配置RouterA2.配置RouterB3.配置RouterC4.验证配置结果 手…

【限时免费】20天拿下华为OD笔试之 【前缀和】2023B-最大子矩阵和【欧弟算法】全网注释最详细分类最全的华为OD真题题解

文章目录 题目描述与示例题目描述输入描述输出描述示例输入输出说明 解题思路如何表示一个子矩阵暴力解法二维前缀和优化二维前缀和矩阵的构建 代码解法一&#xff1a;二维前缀和PythonJavaC时空复杂度 解法二&#xff1a;暴力解法&#xff08;不推荐&#xff09;PythonJavaC时…

Pattern Recognition投稿经验

文章目录 ManuscriptTitle PageHighlightsAuthor BiographyDeclarationSubmit 合作推广&#xff0c;分享一个人工智能学习网站。计划系统性学习的同学可以了解下&#xff0c;点击助力博主脱贫( •̀ ω •́ )✧ 停更了大半年&#xff0c;近期终于完成了论文投稿&#xff0c;趁…

聚观早报 |联想集团Q2财季业绩;小鹏汽车Q3营收

【聚观365】11月17日消息 联想集团Q2财季业绩 小鹏汽车Q3营收 微软发布两款自研AI芯片 FAA批准SpaceX再次发射星际飞船 2023 OPPO开发者大会 联想集团Q2财季业绩 全球数字经济领导企业联想集团公布截至2023年9月30日的2023/24财年第二财季业绩&#xff1a;整体营收达到10…

闲聊从零开发一个2D数字人流程实战

.2D数字人技术 百度&#xff0c;腾讯&#xff0c;等大厂都有自己的数字平台制作&#xff08;套壳&#xff1a;api后台转发vue前端&#xff09;&#xff0c;国外也有出名的heygen&#xff08;非常厉害一个&#xff09;通过开源项目组合实现&#xff0c;再打通每个项目已api的形…

OpenAI 变天:Sam Altman 被踢出局,原 CTO 暂代临时 CEO

文章目录 灵魂人物 Sam Altman 离任 OpenAICEO 下台&#xff1a;OpenAI 也宫斗&#xff1f;个人简介 hello&#xff0c;大家好&#xff0c;我是 Lorin&#xff0c;一觉醒来科技圈发生了一件令人震惊的大事&#xff1a;Sam Altman 被踢出局&#xff0c;原 CTO 暂代临时 CEO。 灵…

Flask学习一:概述

搭建项目 安装框架 pip install Flask第一个程序 from flask import Flaskapp Flask(__name__)app.route(/) def hello_world():return "Hello World"if __name__ __main__:app.run()怎么说呢&#xff0c;感觉还不错的样子。 调试模式 if __name__ __main__:a…

搭建企业社区,如何激发员工互动?

本文是关于企业内部社区搭建后怎么运营&#xff0c;如何激发员工互动。 作为运营者&#xff0c;我们搭建企业内部员工的目的首先得明确下来&#xff0c;一般都是打造和宣扬企业内部文化&#xff0c;发布公司政策通知和行业动态、组织公司关键节点活动、以及员工经验分享资源分…

【数据结构】图的存储结构及实现(邻接表和十字链表)

一.邻接矩阵的空间复杂度 假设图G有n个顶点e条边&#xff0c;则存储该图需要O&#xff08;n^2) 不适用稀疏图的存储 二.邻接表 1.邻接表的存储思想&#xff1a; 对于图的每个顶点vi&#xff0c;将所有邻接于vi的顶点链成一个单链表&#xff0c;称为顶点vi的边表&#xff08…

基于蛾群算法优化概率神经网络PNN的分类预测 - 附代码

基于蛾群算法优化概率神经网络PNN的分类预测 - 附代码 文章目录 基于蛾群算法优化概率神经网络PNN的分类预测 - 附代码1.PNN网络概述2.变压器故障诊街系统相关背景2.1 模型建立 3.基于蛾群优化的PNN网络5.测试结果6.参考文献7.Matlab代码 摘要&#xff1a;针对PNN神经网络的光滑…