JVM——JVM 是如何执行方法调用的?
JVM 是如何执行方法调用的?
在 Java 世界的底层运作中,方法调用机制是理解 Java 虚拟机(JVM)行为的关键之一。JVM 作为 Java 程序运行的核心,承担着执行字节码、管理内存、调度线程等多项职责。而方法调用作为程序逻辑的基本单位,其执行效率和正确性直接关系到整个程序的性能和稳定性。下面我们深入探讨 JVM 是如何执行方法调用的,从方法的重载与重写,到静态绑定与动态绑定,再到方法表和内联缓存的优化策略,全面解析 JVM 在方法调用中的精妙设计。
方法调用的基础概念
方法的重载与重写
在 Java 编程中,方法的重载(Overloading)和重写(Overriding)是两个核心概念,它们在不同的场景下发挥着重要作用。
方法重载指的是在同一类中,允许定义多个同名方法,只要它们的参数列表不同即可。参数列表的不同可以体现在参数的类型、数量或顺序上。编译器会根据方法调用时提供的参数类型和数量来选择最匹配的方法进行调用。例如:
public class Calculator {public int add(int a, int b) {return a + b;}
public double add(double a, double b) {return a + b;}
}
在这个例子中,Calculator
类定义了两个 add
方法,一个用于整数相加,另一个用于浮点数相加。调用时,编译器会根据传入参数的类型选择合适的方法。
方法重写则发生在子类继承父类方法的情况下。子类可以重写父类的方法以提供特定的实现。重写的方法必须保持相同的方法名和参数列表,但可以改变方法的实现逻辑。例如:
public class Animal {public void speak() {System.out.println("Animal speaks");}
}
public class Dog extends Animal {@Overridepublic void speak() {System.out.println("Dog barks");}
}
这里,Dog
类重写了 Animal
类的 speak
方法。当通过 Dog
类的实例调用 speak
方法时,会执行子类中定义的实现。
静态绑定与动态绑定
JVM 在执行方法调用时,会根据方法的绑定类型来决定目标方法的选择策略。静态绑定(Static Binding)和动态绑定(Dynamic Binding)是两种主要的绑定方式。
静态绑定,也称为早期绑定(Early Binding),是指在编译阶段就能确定目标方法的调用方式。典型的静态绑定方法包括静态方法(static
)和私有方法(private
)。这些方法的调用在编译时就已经确定,不会在运行时改变。例如:
public class MathUtils {public static int add(int a, int b) {return a + b;}
}
调用 MathUtils
类的 add
方法时,编译器会直接定位到该静态方法,无需在运行时进行方法查找。
动态绑定,也称为后期绑定(Late Binding),是指目标方法的确定延迟到运行时。这种绑定方式主要用于支持多态,允许在运行时根据对象的实际类型来选择合适的方法实现。例如:
Animal animal = new Dog();
animal.speak();
在这段代码中,animal
的编译时类型是 Animal
,但运行时类型是 Dog
。JVM 会根据 animal
的实际类型动态绑定到 Dog
类的 speak
方法。
JVM 执行方法调用的机制
字节码指令
JVM 使用字节码指令来表示方法调用操作。每条字节码指令都有其特定的用途和执行逻辑。以下是几种常见的方法调用相关指令:
-
invokestatic:用于调用静态方法。
-
invokespecial:用于调用实例构造器(
<init>
方法)、私有方法和父类方法。 -
invokevirtual:用于调用虚方法,即非私有、非静态的实例方法。
-
invokeinterface:用于调用接口方法。
-
invokedynamic:用于动态方法调用,支持运行时动态解析方法。
这些指令在类文件中以操作码(Opcode)的形式存在,并附带必要的操作数。例如,invokevirtual
指令需要指定目标方法所在的类、方法名和方法描述符。
符号引用与动态解析
在编译阶段,Java 编译器会将方法调用转换为符号引用(Symbolic Reference)。符号引用是一种逻辑表示,包含了目标方法的类名、方法名和方法描述符等信息。这些符号引用存储在类文件的常量池中。
当 JVM 执行方法调用指令时,会根据符号引用动态解析目标方法的实际内存地址。对于静态绑定的方法(如静态方法和私有方法),JVM 可以在类加载期间或方法调用前直接解析出目标方法的地址。而对于动态绑定的方法(如虚方法和接口方法),JVM 需要在运行时根据对象的实际类型来确定目标方法。
方法表与动态绑定
为了高效地实现动态绑定,JVM 为每个类维护了一张方法表(Method Table)。方法表是一个数组结构,其中每个元素指向类中的一个方法实现。方法表的索引值在类加载期间确定,并且子类方法表中重写父类方法的索引值与父类方法表中对应方法的索引值保持一致。
当调用虚方法时,JVM 会根据对象的实际类型获取对应的方法表,并使用方法描述符中的索引值来查找目标方法。这种查找方式使得动态绑定能够在运行时快速定位到正确的方法实现,而无需每次都进行全范围的方法搜索。
内联缓存优化
动态绑定虽然提供了多态的灵活性,但其查找过程可能会引入一定的性能开销。为了解决这一问题,JVM 的即时编译器(JIT)引入了内联缓存(Inlining Cache)优化技术。
内联缓存通过缓存最近一次方法调用的对象类型和对应的目标方法,来加速后续相同类型对象的方法调用。例如,如果一个方法调用在大多数情况下都作用于相同类型的对象,内联缓存可以避免每次都访问方法表,直接使用缓存的目标方法地址。这种优化显著减少了方法调用的延迟,提高了程序的执行效率。
内联缓存分为单态内联缓存(Monomorphic Inline Cache)和多态内联缓存(Polymorphic Inline Cache)。单态内联缓存适用于几乎总是同一类型对象的情况,而多态内联缓存则可以处理少数几种不同类型的对象。当内联缓存无法命中时,JVM 会退回到使用方法表进行动态绑定。
方法调用的性能优化
方法内联
方法内联(Method Inlining)是即时编译器在优化阶段采取的一种重要策略。它将被调用方法的代码直接插入到调用点,避免了方法调用和返回的开销。对于频繁调用的小方法,内联可以显著提高执行效率。例如:
public class MathUtils {public static int add(int a, int b) {return a + b;}
}
public class Calculator {public static void main(String[] args) {int result = MathUtils.add(2, 3);System.out.println(result);}
}
在优化阶段,JIT 编译器可能会将 MathUtils.add
方法的代码内联到 Calculator.main
方法中,生成如下伪代码:
public class Calculator {public static void main(String[] args) {int result = 2 + 3;System.out.println(result);}
}
单态内联缓存
单态内联缓存是针对虚方法调用的一种优化手段。它记录了最近一次调用的对象类型,并在后续调用时优先检查该类型。如果类型匹配,则直接调用缓存的目标方法,避免了方法表的查找开销。例如:
public abstract class Passenger {public abstract void passThroughImmigration();
}
public class ChinesePassenger extends Passenger {@Overridepublic void passThroughImmigration() {System.out.println("Chinese passenger passes through immigration.");}
}
public class ForeignerPassenger extends Passenger {@Overridepublic void passThroughImmigration() {System.out.println("Foreign passenger passes through immigration.");}
}
public class Main {public static void main(String[] args) {Passenger passenger = new ChinesePassenger();passenger.passThroughImmigration(); // 第一次调用,缓存 ChinesePassenger 类型passenger = new ChinesePassenger();passenger.passThroughImmigration(); // 第二次调用,命中内联缓存}
}
在这个例子中,第二次调用 passThroughImmigration
方法时,JVM 可以直接使用内联缓存中的目标方法地址,而无需再次访问方法表。
多态内联缓存
多态内联缓存扩展了单态内联缓存的功能,可以处理多种不同类型的对象。它维护了一个小型缓存表,记录了多种类型及其对应的目标方法。当调用对象类型匹配缓存中的任意一种类型时,即可直接调用相应的方法。例如:
public class Main {public static void main(String[] args) {Passenger passenger = new ChinesePassenger();passenger.passThroughImmigration(); // 缓存 ChinesePassenger 类型passenger = new ForeignerPassenger();passenger.passThroughImmigration(); // 缓存 ForeignerPassenger 类型}
}
多态内联缓存会记录这两种类型及其对应的方法地址,从而在后续调用中快速匹配并执行目标方法。
案例分析:虚方法调用的性能影响
为了更直观地理解虚方法调用的性能影响,我们可以通过一个简单的测试来比较单态内联缓存和超多态内联缓存的执行效率。以下是一个示例代码:
public abstract class Passenger {public abstract void passThroughImmigration();
}public class ChinesePassenger extends Passenger {@Overridepublic void passThroughImmigration() {}
}public class ForeignerPassenger extends Passenger {@Overridepublic void passThroughImmigration() {}
}public class Main {public static void main(String[] args) {Passenger a = new ChinesePassenger();Passenger b = new ForeignerPassenger();long current = System.currentTimeMillis();for (int i = 1; i <= 2_000_000_000; i++) {if (i % 100_000_000 == 0) {long temp = System.currentTimeMillis();System.out.println(temp - current);current = temp;}Passenger c = (i < 1_000_000_000) ? a : b;c.passThroughImmigration();}}
}
在这个测试中,我们交替调用 ChinesePassenger
和 ForeignerPassenger
的 passThroughImmigration
方法。由于这两种类型的交替出现,内联缓存无法持续命中,JVM 最终会退化为超多态内联缓存,直接使用方法表进行动态绑定。通过对比不同场景下的执行时间,我们可以观察到内联缓存对性能的影响。
总结
JVM 在执行方法调用时,采用了多种机制和优化策略以确保方法调用的高效性和灵活性。从方法的重载与重写,到静态绑定与动态绑定,再到方法表和内联缓存的优化,JVM 的设计充分考虑了性能和功能的平衡。
理解这些机制不仅有助于我们编写更高效的 Java 代码,还能帮助我们更好地应对实际开发中遇到的各种性能问题。通过合理利用 JVM 的优化特性,我们可以构建出高性能、高可靠性的 Java 应用程序,充分发挥 Java 平台的优势。
相关文章:
JVM——JVM 是如何执行方法调用的?
JVM 是如何执行方法调用的? 在 Java 世界的底层运作中,方法调用机制是理解 Java 虚拟机(JVM)行为的关键之一。JVM 作为 Java 程序运行的核心,承担着执行字节码、管理内存、调度线程等多项职责。而方法调用作为程序逻辑…...
一天学完JDBC!!(万字总结)
文章目录 JDBC是什么 1、环境搭建 && 入门案例2、核心API理解①、注册驱动(Driver类)②、Connection③、statement(sql注入)④、PreparedStatement⑤、ResultSet 3、jdbc扩展(ORM、批量操作)①、实体类和ORM②、批量操作 4. 连接池①、常用连接池②、Durid连接池③、Hi…...
【愚公系列】《Manus极简入门》011-习惯养成教练:“习惯塑造师”
🌟【技术大咖愚公搬代码:全栈专家的成长之路,你关注的宝藏博主在这里!】🌟 📣开发者圈持续输出高质量干货的"愚公精神"践行者——全网百万开发者都在追更的顶级技术博主! …...
精益数据分析(38/126):SaaS模式的流失率计算优化与定价策略案例
精益数据分析(38/126):SaaS模式的流失率计算优化与定价策略案例 在创业和数据分析的领域中,我们不断探索如何更精准地把握业务发展的关键要素。今天,带着与大家共同进步的想法,深入研读《精益数据分析》&a…...
50.【必备】二分答案法与相关题目
本文的网课内容学习自B站左程云老师的算法详解课程,旨在对其中的知识进行整理和分享~ 网课链接:算法讲解051【必备】二分答案法与相关题目_哔哩哔哩_bilibili 一.爱吃香蕉的珂珂 题目:爱吃香蕉的珂珂 算法原理 整体思路 这是一个二分查找算法…...
C# 方法(局部变量和局部常量)
本章内容: 方法的结构 方法体内部的代码执行 局部变量 局部常量 控制流 方法调用 返回值 返回语句和void方法 局部函数 参数 值参数 引用参数 引用类型作为值参数和引用参数 输出参数 参数数组 参数类型总结 方法重载 命名参数 可选参数 栈帧 递归 局部变量 和第5章介绍的字段…...
MQTT 协议与 HTTP 协议的区别
在现代的网络通信中,MQTT 协议和 HTTP 协议都扮演着重要的角色,但它们有着不同的特点和适用场景。下面我们就从多个方面来详细探讨它们之间的区别。 一.协议设计理念 1. MQTT 协议 MQTT(Message Queuing Telemetry Transport)即…...
博弈论思维——AI与思维模型【90】
一、定义 博弈论思维模型是一种研究在相互影响的决策情境中,参与者如何通过策略选择来实现自身利益最大化的理论框架。它分析参与者之间的相互作用、策略组合以及由此产生的结果,帮助人们理解在竞争或合作环境下的决策逻辑和行为模式。 二、由来 博弈…...
【Bootstrap V4系列】学习入门教程之 表格(Tables)和画像(Figure)
Bootstrap V4系列 学习入门教程之 表格(Tables)和画像(Figure) 表格(Tables)一、Examples二、Table head options 表格头选项三、Striped rows 条纹行四、Bordered table 带边框的表格五、Borderless table…...
第 3 篇:有序的世界:有序表 (TreeMap/TreeSet) 的概念与优势
上一篇我们探讨了哈希表如何以牺牲顺序为代价换取极致的平均速度。然而,在现实世界的许多应用中,数据的有序性不仅是锦上添花,甚至是核心需求。想象一下: 你需要显示一个按价格排序的商品列表。你需要找到某个时间点之前或之后的…...
VulnHub-DC-2靶机
主机发现 sudo arp-scan -l 以sudo管理员权限扫描本地活动ip地址 Interface: eth0, type: EN10MB, MAC: 08:00:27:22:46:4f, IPv4: 192.168.252.230 Starting arp-scan 1.10.0 with 256 hosts (https://github.com/royhills/arp-scan) 192.168.252.6 4c:5f:70:74:3c:3b …...
论文笔记(八十三)STACKGEN: Generating Stable Structures from Silhouettes via Diffusion
STACKGEN: Generating Stable Structures from Silhouettes via Diffusion 文章概括摘要I. INTRODUCTIONII. 相关工作A. 从直觉物理学学习稳定性B. 用于姿态生成的扩散模型C. 自动化顺序装配 III. 方法A. 用于 S E ( 3 ) SE(3) SE(3)积木姿态生成的扩散模型B. 模型架构C. 数据生…...
论文阅读笔记——TesserAct: Learning 4D Embodied World Models
TesserAct 论文 采用RGB-DN(RGB深度法线) 作为 4D 场景中间表示,由此建模 4D 场景,比纯 2D 视频更准确地建模 3D 几何结构。相比现有的 4D 视频生成,优化速度快,收敛好,且首次从当前帧和文本描述…...
变转速振动信号分析处理与故障诊断算法模块
变转速振动信号分析处理与故障诊断算法模块,作为信号处理算法工具箱的主要功能模块,形成了以变转速振动信号分析处理与故障诊断算法模块的经典算法模型,可应用于各类关键机械部件(轴承、齿轮、转子等)的信号分析、故障…...
每日算法-250502
每日算法 - 2025.05.02 记录一下今天刷的几道 LeetCode 算法题。 3191. 使二进制数组全部等于 1 的最少操作次数 I 题目 思路 贪心 解题过程 遍历数组 nums。当我们遇到 nums[i] 时: 如果 nums[i] 是 1,我们不需要进行操作,因为目标是全 …...
如何在纯C中实现类、继承和多态(小白友好版)
基本实现原理 /* 通过结构体函数指针模拟类 */ typedef struct {// 成员变量int x; // 成员方法(函数指针) void (*print)(void* self); } MyClass;/* 成员函数实现 */ void my_print(void* self) {MyClass* obj (MyClass*)self;p…...
AE/PR插件 转场创建大师专业版 Transition Master Pro v2.0.2 Win+使用教程
Transition Master Pro v2.0.2是一款原生转场插件,专为Adobe Premiere Pro和After Effects设计。它提供了创建、导出和销售自己的转场效果,或从一个庞大的转场预设库中选择。使用Transition Master Pro v2.0.2,您可以快速轻松地创建令人惊叹的…...
[Linux]从零开始的STM32MP157 Buildroot根文件系统构建
一、前言 在前面的教程中,教了大家如何移植一个LInux的内核并且正确启动,我们发现Linux内核在启动后会出现一个错误,提示我们没有找到根文件系统。那么什么是根文件系统呢?之前我们使用Ubuntu编译了STM32MP157的TF-A,UBOOT,LINUX内…...
阿里云服务器 篇五(加更):短链服务网站:添加反垃圾邮件功能
文章目录 系列文章(可选)更新YOURLS版本安装 Compliance 插件安装 Phishtank-2.0 插件(可选)安装 httpBL 插件样例网站(不推荐)使用谷歌解决方案更多系列文章 阿里云服务器 篇一:申请和初始化 阿里云服务器 篇二:搭建静态网站 阿里云服务器 篇三:提交搜索引擎收录 阿…...
状压 DP 详解
文章目录 简介做法洛谷 P1171 简介 状压 DP 其实约等于一个 DP 的小技巧,一般应用在处理一个或多个集合的问题中(因为状压 DP 的下标就是一个集合),而且在 n n n 太大的时候建议不要使用这种方法。(如果你不懂&#…...
多模态大模型轻量化探索-视觉大模型SAM(Segment Anything Model)
往期,笔者基于LLava的数据对齐训练,搞了一个Reyes多模态大模型,并且看了些多模态大模型,相关开源的多模态大模型如:KimiVL、Internvl、QwenVL等,其视觉编码器的尺寸都比较大,如:Moon…...
数据分析_问题/优化
1 报表开发 1.1 数据问题 (1) 数据易错 问题描述 ①数据整合困难:数据来源多样、格式差异大,整合时处理不当易丢错数据. ②计算逻辑复杂:开发人员对复杂计算逻辑的理解产生偏差,会导致计算结果不准. 解决方案 ①建立数据标准,统一修正字段命名、数据类型、日期格式等 ②加强…...
我的stm32驱动电机驱动着突然就卡死程序死机了是为什么
电源不稳定或干扰 电机启动电流冲击:电机运行时可能导致电源电压跌落,影响STM32稳定性。需检查电源滤波电容、使用独立电源或增加稳压模块 地线干扰:电机与MCU共地时,高频噪声可能通过地线耦合,需采用隔离电路或磁耦芯…...
使用 Java 实现一个简单且高效的任务调度框架
目录 一、任务调度系统概述 (一)任务调度的目标 (二)任务调度框架的关键组成 二、任务状态设计 (一)任务状态流转设计 (二)任务表设计(SQL) 三、单机任…...
Git 完整教程:初学者分步指南
大家好,这里是架构资源栈!点击上方关注,添加“星标”,一起学习大厂前沿架构! Git 是一个分布式版本控制系统,可以帮助开发人员跟踪代码更改、与他人协作以及高效管理软件项目。无论您是初学者还是正在提升…...
数字智慧方案5856丨智慧环保综合解决方案(50页PPT)(文末有下载方式)
资料解读:智慧环保综合解决方案 详细资料请看本解读文章的最后内容。 随着城市化进程的加速和环境问题的日益严峻,智慧环保成为提升城市环境管理水平的重要手段。本文将对智慧环保综合解决方案进行详细解读,探讨其在实际应用中的需求、解决…...
VBA快速合并多列单元格
实例需求:工作表中第3行到第5行有如下图所示的数据表,为了方便展示,隐藏了部分列,实际数据为从C列到DO列。 现需要合并第3行和第4行相同内容的单元格,如第10行到第12行所示。 示例代码如下。 Sub MergeDemo()Dim dicM…...
区块链+IoT:创新场景落地背后的技术攻坚战
物联网(IoT)与区块链技术作为两大颠覆性技术,正通过深度融合推动各行各业的数字化转型。物联网通过连接海量设备实现数据互通与智能化管理,而区块链凭借去中心化、不可篡改和可追溯的特性,为物联网的安全性、隐私保护和…...
自动化测试项目2 --- 比特纵横 [软件测试实战 Java 篇]
目录 项目介绍 项目源码 库地址 项目功能测试 1. 自动化实施步骤 1.1 编写测试用例 1.2 自动化测试脚本开发 1.2.1 配置相关环境, 添加依赖 1.2.2 代码编写 2. 编写自动化脚本过程问题总结 2.1 Actons 方法的使用 2.2 等待的使用 2.3 页面操作 项目性能测试 1. 进…...
【学习笔记】深入理解Java虚拟机学习笔记——第1章 走进Java
第1章 走进Java 1.1 概述 Java成功的原因 1>一次编写到处运行 2>内存管理安全,自动回收 3>运行时编译 4>强大成熟的第三方库 1.2 Java技术体系 1>Java技术体系组成: -Java语言 -Java虚拟机实现 -class文件格式 -Java类库API -第三方J…...
JavaScript性能优化实战之运行时性能优化
在 JavaScript 开发中,运行时性能优化是确保网页响应迅速和流畅的重要环节。优化运行时性能不仅能提高用户体验,还能在高并发的情况下保证应用的稳定性。本文将细化几个常见的 JavaScript 运行时性能优化策略,帮助你提高代码执行效率。 1️⃣ 避免不必要的内存分配和释放 J…...
走进AI的奇妙世界:探索历史、革命与未来机遇
2022年11月30日,ChatGPT的横空出世像一枚深水炸弹,掀起了全球范围的AI狂潮。但这场革命并非偶然——它背后是80年AI发展史的厚积薄发。从图灵的哲学思辨到深度学习的技术突破,再到生成式AI的“涌现”时刻,AI正以惊人的速度模糊人机…...
用c 编写的笔记搜索程序
{XXX文本记录} 文本记录格式 xxx 搜索词条 #include <stdio.h> #include <string.h> #include <stdlib.h>int main(void){FILE *ffopen("help.txt","r");if(fNULL){perror("file");return -1;}char nr[2000];f…...
鼎讯信通 智能通信干扰设备:多频段多模态信号压制解决方案
在万物互联时代,通信安全已成为现代社会的核心基础设施防护重点。面对日益复杂的电磁环境挑战,新一代智能通信干扰设备通过技术创新实现了信号压制能力的革命性突破。本文将深入解析该设备的八大核心功能与技术特性,展现其在商业通信保障、工…...
软件测试概念
这里写目录标题 需求开发模型软件生命周期瀑布模型螺旋模型增量模型、迭代模型敏捷模型Scrum 测试模型V模型W模型(双V模型) 需求 用户需求:没有经过合理的评估,通常就是一句话 软件需求:是开发人员和测试人员执行工作…...
数据库性能杀手与调优实践
目录 前言一、索引缺失引发的全表扫描灾难1.现象与影响2.优化策略 二、SELECT * 的隐性成本1.危害分析2.优化实践 三、分页查询的性能陷阱1.深度分页问题2.优化方案对比 四、执行计划分析方法论1.关键指标解读2.典型劣化模式识别 五、综合优化最佳实践总结 前言 在数据库应用开…...
初始化列表详解
1.类中包含以下成员,必须放在初始化列表位置进行初始化: 1. 引用成员变量 2.const成员变量 3. 自定义类型成员(且该类没有默认构造函数时 ) 2. 成员变量在类中声明次序就是其在初始化列表中的初始化顺序,与其在初始化列表中的先后次序无关…...
【CVE-2025-1094】:PostgreSQL 14.15 SQL注入漏洞导致的RCE_ 利用代码和分析
目标 PostgreSQL 14.15BeyondTrust Privileged Remote Access (PRA) 和 Remote Support (RS) 软件受影响的版本:使用PostgreSQL 14.15及其版本的BeyondTrust产品Explain CVE-2025-1094 是 PostgreSQL 14.15 版本的 psql 交互式工具中发现的 SQL 注入漏洞。由于输入值的验证不…...
【验证技能】VIP项目大总结
VIP项目快做一段落了,历时一年半,也该要一个大汇总。 VIP简介 VIP开发流程 VIP难点 进程同步 打拍插入不同bit位宽数据问题。 动态升降lane VIP做的不好的地方和改进想法 各层之间交互 testsuite两端关键 所有层的实现架构不统一 VIP经验 ** 架构…...
MyBatis 参数处理全解析
在 Java 开发领域,MyBatis 作为一款优秀的持久层框架,凭借其简洁的设计和强大的功能,受到了广大开发者的青睐。而参数处理作为 MyBatis 中一个至关重要的环节,掌握好它能让我们更高效地使用 MyBatis 进行数据库操作。本文将全面深…...
【自然语言处理与大模型】使用Xtuner进行QLoRA微调实操
本文首先对Xtuner这一微调框架进行简单的介绍。手把手演示如何使用Xtuner对模型进行微调训练,包括数据准备、训练命令执行及训练过程中的监控技巧。最后,在完成微调之后,本文还将介绍如何对微调结果进行简单对话测试。 一、Xtuner微调框架 X…...
2023华为od统一考试B卷【二叉树中序遍历】
前言 博主刷的华为机考题,代码仅供参考,因为没有后台数据,可能有没考虑到的情况 如果感觉对你有帮助,请点点关注点点赞吧,谢谢你! 题目描述 思路 0.用Character数组存储树,index下标的左右…...
Midjourney 绘画 + AI 配音:组合玩法打造爆款短视频!
一、引言:AI 重构短视频创作范式 在某短视频工作室的深夜剪辑室里,资深编导正在为一条古风剧情视频发愁:预算有限无法实拍敦煌场景,人工绘制分镜耗时 3 天,配音演员档期排到一周后。而使用 Midjourney 生成敦煌壁画风格的场景图仅需 15 分钟,AI 配音工具实时生成多角色台…...
敏感词 v0.25.1 新特性之返回匹配词,修正 tags 标签
开源项目 敏感词核心 https://github.com/houbb/sensitive-word 敏感词控台 https://github.com/houbb/sensitive-word-admin 版本特性 大家好,我是老马。 敏感词以前在实现的时候,没有返回底层实际匹配的词,有时候问题排查非常耗费时间。 …...
【多线程】六、基于阻塞队列的生产者消费者模型
文章目录 Ⅰ. 生产者消费者模型的概念Ⅱ. 生产者消费者模型的优点Ⅲ. 基于阻塞队列的生产者消费者模型MakefileBlock_queue.hpptask.hpptest.cppⅣ. 如何理解提高了效率❓❓❓Ⅰ. 生产者消费者模型的概念 生产者消费者模型是一种常见的并发模式,用于解决生产者和消费者之间…...
解决Flutter项目中Gradle构建Running Gradle task ‘assembleDebug‘卡顿问题的终极指南
解决Flutter项目中Gradle构建Running Gradle task ‘assembleDebug‘卡顿问题的终极指南 前言 在开发Flutter应用时,经常会遇到Gradle构建卡在Running Gradle task assembleDebug阶段的问题。本文将分享如何通过配置华为云镜像和使用自定义脚本下载依赖的方法解决这些问题。…...
IntelliJ IDEA 保姆级使用教程
文章目录 一、创建项目二、创建模块三、创建包四、创建类五、编写代码六、运行代码注意 七、IDEA 常见设置1、主题2、字体3、背景色 八、IDEA 常用快捷键九、IDEA 常见操作9.1、类操作9.1.1、删除类文件9.1.2、修改类名称注意 9.2、模块操作9.2.1、修改模块名快速查看 9.2.2、导…...
从此,K8S入门0门槛!
前言 当你想要入门K8S的时候,往往会被各种概念搞的晕乎乎的,什么API Server,Scheduler,Controller manager,Etcd,Pod,Kubelet,kube-proxy,deployment…… 哪怕你使用了…...
vue2和vue3组件如何监听子组件生命周期
在 Vue 中监听子组件的生命周期是一个常见需求,但 Vue 官方并不直接推荐这么做,因为这会打破组件的封装性。但在**一些特定场景(如自动化监控、封装逻辑复用)**下仍是有意义的。 下面分别讲解 Vue 2 和 Vue 3 中如何监听 子组件的…...
如何用Python绘制两个圆之间的8条公切线
引言 在几何学中,两圆之间存在多种类型的公共切线。本文将通过Python代码演示如何绘制两个同心圆(半径分别为1.0和3.0)之间的8条公切线,并解释相关数学原理与代码实现细节。 环境准备 import matplotlib.pyplot as plt import …...