当前位置: 首页 > news >正文

深入解析 EasyExcel 组件原理与应用

深入解析 EasyExcel 组件原理与应用

官方:EasyExcel官方文档 - 基于Java的Excel处理工具 | Easy Excel 官网

在日常的 Java 开发工作中,处理 Excel 文件的导入导出是极为常见的需求。
今天,咱们就一起来深入了解一款非常实用的操作 Excel 的组件 ——EasyExcel,看看它究竟有着怎样的神奇之处,能让众多开发者青睐有加。

一、引言

想必大家都知道,在 Java 领域中,Apache POI 是处理 Excel 文件的老牌工具了。但随着业务发展,面对越来越大的 Excel 文件读写需求时,POI 暴露出了一些诸如内存溢出(OOM)等问题,使用起来稍显吃力。而 EasyExcel 的出现,很好地弥补了这些不足,它基于 POI 进行了优化封装,为我们提供了更加简洁高效的 Excel 处理方式。接下来,咱们就详细剖析一下 EasyExcel 的原理以及它的具体应用。

二、EasyExcel 与 Apache POI 的渊源

EasyExcel 其实是站在 Apache POI 这个 “巨人的肩膀” 上发展起来的。Apache POI 基于 OOXML(Office Open XML)标准(像 xlsx、docx、pptx 等以指定格式的 xml 为基础并以 zip 格式压缩的文件)和 OLE2 标准(包括 xls、doc、ppt 等二进制格式的文件),只要符合上述标准的文件它都能进行读写操作。

对于 xlsx 文件来说,它基于 OOXML 标准,能够解压成对应的 xml 文件,在解析后的 xml 文件里,我们重点关注 sharedStrings.xml 与 sheet1.xml 这两个 xml 节点,因为里面存放着我们想要处理的 Excel 内容。

不过,POI 在处理 Excel 时有传统的 POM 解析和 SAX 解析两种方式。传统的 POM 解析会把 Excel 中的所有 XML 节点解析成一棵 DOM 树,整棵 DOM 树加载进内存,这样做虽然方便对每个 XML 节点进行随机访问,但很容易导致内存溢出现象,像仅仅 3 列的 Excel 文件在 7 万行左右就可能出现内存溢出问题。

而 SAX 解析则不同,它采用边读取边处理的方式操作 XML,逐行扫描 XML 文档,遇到标签时触发解析处理器,进而触发相应的事件 Handler。这种方式内存占用小、效率高,但 POI 官方提供的 API 过于繁琐,使用起来步骤繁多,比如读取一个 Excel 文件,要先将 xlsx 格式的 Excel 文件解析成 OPCPackage 对象,再创建 XSSFReader 对象来解析获取对应 xlsx 下的 xml 内容,想要处理还得进一步创建内容处理器等等,着实有些麻烦。

三、EasyExcel 的原理剖析

(一)核心架构与流程

在 EasyExcel 中,有一个核心的类叫 ExcelAnalyserImpl,它就像是整个操作的调度中心。里面包含了 AnalysisContext 类(分析上下文,存放对应的文件 Inputstream 跟 AnalysisEventListener 事件监听处理器等)和 ExcelReadExecutor 类(默认是 XlsxSaxAnalyser 类,核心方法是 parseXmlSource (),负责逐行 SAX 解析 Excel)。

当 XlsxSaxAnalyser 解析类执行解析方法后,会调用 AnalysisEventProcessor 执行对应的事件方法,而在这个 processor 里真正执行操作的就是对应的事件监听器啦。官方默认提供了一个事件监听器,能把 Excel 解析成 BeanMap 的形式,然后根据我们传入的实体类,返回给我们想要的实体类对象。要是我们有定制化的功能需求,那就需要去了解这个监听器的核心方法了哦。

以下是一个简单的示例代码,展示如何使用 EasyExcel 读取 Excel 文件并将数据转换为自定义对象(假设我们有一个 User 实体类,包含 name 和 age 等属性):

import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;// 自定义监听器,用于处理读取到的数据
class UserDataListener extends AnalysisEventListener<User> {private List<User> userList = new ArrayList<>();// 每解析一行数据就会调用此方法@Overridepublic void invoke(User user, AnalysisContext analysisContext) {userList.add(user);}// 全部解析完成后调用此方法@Overridepublic void doAfterAllAnalysed(AnalysisContext analysisContext) {// 这里可以对读取到的所有数据进行后续操作,比如存入数据库等System.out.println("共读取到 " + userList.size() + " 条用户数据");}public List<User> getUserList() {return userList;}
}public class EasyExcelReadExample {public static void main(String[] args) throws IOException {String filePath = "your_excel_file_path.xlsx";  // 替换为实际的 Excel 文件路径// 读取 Excel 文件,第二个参数是自定义的监听器EasyExcel.read(new FileInputStream(filePath), User.class, new UserDataListener()).sheet().doRead();}
}
注解

  • 在上述代码中,首先定义了 UserDataListener 类,它继承自 AnalysisEventListener,并重写了 invoke 和 doAfterAllAnalysed 方法。invoke 方法用于在每解析一行 Excel 数据时将其封装成 User 对象并添加到 userList 中,而 doAfterAllAnalysed 方法则在整个 Excel 文件解析完成后执行,可以在这里进行一些后续的数据处理操作,比如将数据批量存入数据库等。
  • 在 EasyExcelReadExample 类的 main 方法中,通过 EasyExcel.read 方法来启动 Excel 文件的读取流程,传入文件输入流、要转换的目标对象类型(这里是 User 类)以及自定义的监听器,然后调用 sheet 和 doRead 方法完成读取操作。

(二)关键方法解析

1. doRead () 方法
doRead () 方法实际调用过程还挺有意思的,它先是调用了 ExcelReader 中的 read 方法与 finish 方法。read 方法实际调用了 Executor 中的 execute 方法,这个 execute 方法里会调用前面提到的核心方法 parseXmlSource 解析 excel,并且在一个 sheet 中所有数据读取完后,会调用事件调度器的 endSheet 方法,让每一个监听器执行对应的 doAfterAllAnalysed 方法。而 finish 方法则负责对读取过程持有容器中流的内容输出,之后清理存储的缓存,把开启的相应的流关闭。
2. doWrite () 方法
doWrite () 方法同样调用了 Writer 中的 write 方法和 finish 方法,这里的 finish 方法作用和读操作里类似哦。write 方法实际调用的是 Builder 中的 addContent 方法,在 addContent 方法里又会调用 Executor 中的 add 方法,针对传入的列表,逐个对象执行 addOneRowOfDataToExcel 方法进行逐行写入。在这个过程中,无论是创建行对象前后,还是填充完数据之后,我们都可以自定义处理器对流程进行相应的处理呢,非常灵活。

以下是一个使用 EasyExcel 写入 Excel 文件的示例代码,假设我们要将一个 List<User> 数据写入到 Excel 中:

import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.write.metadata.WriteSheet;
import java.util.ArrayList;
import java.util.List;class User {private String name;private int age;// 构造函数、Getter 和 Setter 方法省略,可根据实际情况补充完整public User(String name, int age) {this.name = name;this.age = age;}
}public class EasyExcelWriteExample {public static void main(String[] args) {List<User> userList = new ArrayList<>();userList.add(new User("张三", 25));userList.add(new User("李四", 30));String filePath = "output_excel_file.xlsx";  // 输出的 Excel 文件路径// 这里使用 EasyExcel 的 write 方法开始写入操作EasyExcel.write(filePath, User.class).sheet("用户信息表").doWrite(userList);}
}
注解

  • 在这个示例中,先定义了 User 类来表示要写入 Excel 的数据对象,包含 name 和 age 等属性(这里省略了部分常规的方法,实际使用中需补充完整)。
  • 在 EasyExcelWriteExample 类的 main 方法中,创建了一个 List<User> 集合并添加了一些示例数据。然后通过 EasyExcel.write 方法启动写入流程,传入输出文件路径和要写入的数据对象类型(User 类),接着指定 sheet 名称,最后调用 doWrite 方法并传入数据列表,这样就可以将数据成功写入到指定的 Excel 文件中啦。

四、EasyExcel 的性能与易用性优势

(一)性能优势

通过官方给出的效果图可以看到,EasyExcel 仅用 16M 内存在 23 秒内就能读取 75M(46W 行 25 列)的 Excel 文件,相比之下,POI 读取内存要用到 100M 往上了,读取时间更是没法比,可见在性能方面,EasyExcel 是遥遥领先呀。这得益于它基于事件机制逐行扫描数据,对数据逐行处理后,只要对象不被引用,就会被 JVM 快速垃圾回收,从而有效避免了 OOM 问题。

(二)易用性优势

使用 EasyExcel 进行文件的导入导出,相比 POI 的流程那可是简化了一大截呢,只要短短几行代码就可以轻松实现 Excel 的导入导出。这对于咱们开发者来说,简直太友好了,能大大提高开发效率呀。

五、EasyExcel 中的设计模式 个人理解

(一)工厂模式

EasyExcel 里的 EasyExcelFactory 类就运用了工厂模式哦。这个类拥有很多对应方法的不同入参的变体,最终目的都是为了根据不同的入参构造对应的 ExcelWriter/ReaderBuilder 对象,让代码调用起来简洁又美观呢。

(二)观察者模式(也叫发布 - 订阅模式)

通过事件监听器的机制,实现了类似观察者模式的效果。当 Excel 文件解析过程中遇到行、单元格等情况时会触发事件,然后通过自定义监听器来处理数据,各个监听器就像是观察者一样,等待着对应的事件发生然后执行相应的操作。

(三)模板方法模式

在解析和写入等流程中,定义了一些模板化的方法,不同的实现类可以按照这些模板去扩展和定制具体的业务逻辑,保证了整体流程的规范性和可扩展性。

(四)装饰器模式

在写样式等方面运用了装饰器模式,方便我们对 Excel 的样式等进行个性化的装饰和处理,让生成的 Excel 文件更加符合实际业务需求。

六、实际应用案例

在实际项目中,EasyExcel 发挥着巨大的作用呢。比如说,我曾经需要从 Excel 表格中批量导入用户信息到 MySQL 数据库里。如果使用 POI,不仅操作复杂,而且面对稍大一点的 Excel 文件就容易出现内存溢出问题。而选择 EasyExcel 后,它简单易用,性能又优越,更重要的是能够节约内存、解决大文件内存溢出问题。像一个 3M 的 excel 文件,用 POI sax 解析依然需要 100M 左右内存,改用 easyexcel 后可以降低到几 M,而且再大的 excel 文件也不会出现内存溢出啦。对于数据量小的文件,我采用同步模式一次性获取所有表格数据并存储到 List 中;对于数据量大的文件,则采用自定义 Listener 的方式异步逐行读取 Excel 并分批插入到数据库中,非常方便高效。

七、总结

总的来说,EasyExcel 作为一款强大的 Excel 处理组件,在 Apache POI 的基础上进行了优化和封装,无论是在性能、易用性还是功能扩展性上都有着出色的表现。通过运用多种设计模式,让它更加灵活且易于使用,在实际项目中能够帮我们轻松应对各种 Excel 文件的读写需求,大大提高了开发效率,也减少了因为内存溢出等问题带来的烦恼。希望大家在之后的开发工作中,如果遇到 Excel 处理相关的业务,不妨试试 EasyExcel 哦,相信它会给你带来意想不到的惊喜。

以上就是本次关于 EasyExcel 的全部内容分享啦,大家如果有任何疑问或者使用心得,欢迎在评论区留言交流呀。

觉得有用的话可以点点赞 (*/ω\*),支持一下。

如果愿意的话关注一下。会对你有更多的帮助。

每天都会不定时更新哦  >人<  。

相关文章:

深入解析 EasyExcel 组件原理与应用

✨深入解析 EasyExcel 组件原理与应用✨ 官方&#xff1a;EasyExcel官方文档 - 基于Java的Excel处理工具 | Easy Excel 官网 在日常的 Java 开发工作中&#xff0c;处理 Excel 文件的导入导出是极为常见的需求。 今天&#xff0c;咱们就一起来深入了解一款非常实用的操作 Exce…...

基础免杀 从.rsrc加载shellcode上线

.rsrc 段是PE文件中的一个特定部分&#xff0c;专门用来存储资源数据。这些资源通常包括图标、位图、字符串表、对话框、菜单、版本信息、字体等 具体的shellcode加载方式不在此探讨 在这使用传统的指针执行 WindowsAPI 需要用到如下API FindResource 获取指定资源的信息块…...

Spring MVC 深度剖析:优势与劣势全面解读

文章目录 Spring MVC 优势1. **松耦合**2. **易于测试**3. **灵活性**4. **强大的配置机制**5. **异常处理**6. **国际化支持**7. **数据验证**8. **安全性**9. **性能优化** Spring MVC 劣势1. **学习曲线**2. **配置复杂性**3. **性能开销**4. **视图技术限制**5. **社区和支…...

基于Angular+BootStrap+SpringBoot简单的购物网站

目录 一、项目结构图 二、目录结构解析 后端 (Spring Boot) 前端 (Angular) 三、技术栈 四、具体功能实现 五、数据库设计 六、后端实现 1. 设置Spring Boot项目 2. 数据库实体类 3. 创建Repository 4. 创建Service层 5. 创建Controller层 七、前端实现&#xff0…...

微软Ignite 2024:建立一个Agentic世界!

在今年的Microsoft Ignite 2024上&#xff0c;AI Agent无疑成为本次大会的重点&#xff0c;已经有十万家企业通过Copilot Studio创建智能体了。微软更是宣布&#xff1a;企业可以在智能体中&#xff0c;使用Azure目录中1800个LLM中的任何一个模型了&#xff01; 建立一个Agent…...

AIGC实践-使用Amazon Bedrock的SDXL模型进行文生图

一、Bedrock 简介 Amazon Bedrock 是 Amazon Web Services (AWS) 提供的一种生成式 AI 服务。通过 Bedrock&#xff0c;用户可以方便地使用多种基础模型&#xff08;Foundation Models&#xff09;&#xff0c;包括 OpenAI 的 GPT、Anthropic 的 Claude 等。这些模型可以用于各…...

Android12 mtk设置插充电器自动开机

Android12 mtk平台通常关机后&#xff0c;插上充电器是进入关机充电流程&#xff0c;显示关机充电动画。 那么根据用户需求&#xff0c;如果需要设置关机之后&#xff0c;实现插上充电器后&#xff0c;自动开机。 正常流程&#xff1a;机器关机 --> 插上充电器 --> 显示…...

Linux高阶——1117—TCP客户端服务端

目录 1、sock.h socket常用函数 网络初始化函数 首次响应函数 测试IO处理函数 获取时间函数 总代码 2、sock.c SOCKET() ACCEPT()——服务端使用这个函数等待客户端连接 CONNECT()——客户端使用这个函数连接服务端 BIND()——一般只有服务端使用 LISTEN()——服务端…...

Linux 命令和 vi/vim 命令

Linux 命令概览 1. 文件和目录操作 列出目录内容 ls&#xff1a;列出当前目录内容ls -l&#xff1a;以长格式列出ls -a&#xff1a;显示隐藏文件ls -lh&#xff1a;以长格式和人类可读方式显示大小ls -R&#xff1a;递归列出子目录ls -d */&#xff1a;仅列出目录ls -t&#x…...

鸿蒙征文|鸿蒙心路旅程:始于杭研所集训营,升华于横店

始于杭研所 在2024年7月&#xff0c;我踏上了一段全新的旅程&#xff0c;前往风景如画的杭州&#xff0c;参加华为杭研所举办的鲲鹏&昇腾集训营。这是一个专门为开发者设计的培训项目&#xff0c;中途深入学习HarmonyOS相关技术。对于我这样一个对技术充满热情的学生来说&…...

【docker】docker commit 命令 将当前容器的状态保存为一个新的镜像

在Docker容器中安装了许多软件&#xff0c;并希望将当前容器的状态保存为一个新的镜像&#xff0c;可以使用docker commit命令来创建一个新的镜像。以下是如何操作的步骤&#xff1a; 找到容器ID或名称&#xff1a; 首先&#xff0c;需要找到想要保存的容器的ID或名称。可以使用…...

Java基础1.0

1.Java有哪些数据结构 Java语言是强类型语言&#xff0c;对于每一种数据都定义了明确的具体数据结构&#xff0c;在内存中分配了不同大小的内存空间。 基本数据结构 整数类型&#xff1a;byte&#xff0c;short&#xff0c;long&#xff0c;int。 字符类型&#xff1a;doub…...

完全二叉树的基本操作(顺序存储)

#include<iostream> #include<math.h> using namespace std;#define MaxSize 100 struct TreeNode {int value;bool isEmpty;//判断该节点是否为空 }t[MaxSize];/** *定义一个长度位MaxSize的数组&#xff0c;按照从上到下&#xff0c; *从左到右的方式依次存储完全…...

Vue Form表单的使用,rules格式校验网络校验,键盘按键监听

Form表单 rules格式校验 可以在validator中进行网络请求&#xff0c;实现网络校验 const formRules {userName: [{required: true, message: "用户名不能为空", trigger: blur}, {min: 5,max: 10,message: "长度必须5-10位",trigger: blur}],passWord: …...

PyTorch2

Tensor的常见操作&#xff1a; 获取元素值&#xff1a; 注意&#xff1a; 和Tensor的维度没有关系&#xff0c;都可以取出来&#xff01; 如果有多个元素则报错&#xff1b; import torch def test002():data torch.tensor([18])print(data.item())pass if __name__ &qu…...

蓝牙 AVRCP 协议详解

前言 随着无线音频设备的普及&#xff0c;蓝牙已经成为智能设备间通信的主流方式之一。除了传输音频流的 A2DP 协议外&#xff0c;AVRCP&#xff08;Audio/Video Remote Control Profile&#xff0c;音频/视频远程控制协议&#xff09;为用户提供了对蓝牙音频设备的控制能力&am…...

深入解析下oracle char和varchar2底层存储方式

oracle数据库中&#xff0c;char和varchar2数据类型用来存储字符数据。char类型一旦定义多大&#xff0c;那么它就分配多少字节空间&#xff1b;varchar2类型定义多大&#xff0c;代表它可以扩展的最大大小为多大&#xff0c;一开始空间根据使用来决定。字符数据存储在oracle表…...

2024年底-Arch linux或转为0BSD许可证!

原文&#xff1a;https://archlinux.org/news/providing-a-license-for-package-sources/ 解读&#xff1a;Arch Linux社区通过RFC 40达成共识&#xff0c;决定将所有软件包源代码更改为0BSD许可证。 0BSD许可证是什么&#xff1f;&#xff1a;这是一个非常自由的开源许可证&a…...

YOLOv10改进,YOLOv10添加SE注意力机制,二次C2f结构

摘要 理论介绍 SE 注意力机制是一种提升卷积神经网络(CNN)性能的模块,SE更关注重要的特征图,增强了网络的表现,同时仅增加了较少的参数。SE 机制包含两个主要步骤: Squeeze (压缩):对所有特征图进行全局平均池化,生成一个通道描述符。Excitation (激励):将通道描述符…...

探索运维新视界,CMDB的3D机房功能深度解析

在数字化转型的浪潮中&#xff0c;数据中心作为企业信息架构的核心&#xff0c;其高效、智能的管理成为了企业竞争力的关键因素之一。3D机房作为这一趋势下的创新产物&#xff0c;正逐步改变着传统机房运维的面貌。本文将结合乐维CMDB&#xff0c;深入探讨3D机房的功能细节、应…...

[QDS]从零开始,写第一个Qt Design Studio到程序调用的项目

前言 最近在使用Qt Design Studio进行开发&#xff0c;但是简中网上要不就是只搜得到Qt Designer(Qt Creator内部库)&#xff0c;要不就只搜得到一点营销号不知道从哪里搬来的账号&#xff0c;鉴于Qt Design Studio是一个这么强大的软件&#xff0c;自然是需要来进行一下小小的…...

万物皆可Docker,在NAS上一键部署最新苹果MacOS 15系统

万物皆可Docker&#xff0c;在NAS上一键部署最新苹果MacOS 15系统 哈喽小伙伴们还&#xff0c;我是Stark-C~ 最近苹果Mac mini 2024款在政府补贴的加持下&#xff0c;仅需3500块钱左右就能到手确实挺香的。我看很多评论区的小伙伴跃跃欲试&#xff0c;但是也有不少之前从未体…...

视频监控实现画面缩放功能

文章目录 概要一、功能说明二、核心实现代码三、技术细节 概要 在视频监控系统中&#xff0c;经常需要查看视频画面中的细节。通过实现区域放大、滚轮缩放和拖拽平移等功能&#xff0c;可以让用户更方便地观察视频细节。本文介绍如何在 Windows 系统下实现这些交互功能。 一、…...

通信综合—8.通信网络安全

一、信息系统安全概述 1.信息系统的构成和分类 信息系统是将用于收集、处理、存储和传播信息的部件组织在一起而成的相关联的整体&#xff0c;般是由计算机硬件、网络和通信设备、计算机软件、信息资源和信息用户组成。它是以处理信息流为目的的人机一体化系统。信息系统主要…...

keepalived双机热备方案实现Nginx高可用

问题描述 只用一台Nginx做反向代理&#xff0c;如果这台Nginx出现故障(比如宕机)&#xff0c;则服务不可用。 以下给出keepalived双机热备方案实现Nginx高可用的方法。先介绍几个概念&#xff1a; 高可用 高可用&#xff08;High Availability&#xff09;是指系统或服务能…...

数据结构——排序算法第一幕(插入排序:直接插入排序、希尔排序 选择排序:直接选择排序,堆排序)超详细!!!!

文章目录 前言一、排序1.1 概念1.2 常见的排序算法 二、插入排序2.1 直接插入排序2.2 希尔排序希尔排序的时间复杂度 三、选择排序3.1 直接选择排序3.2 堆排序 总结 前言 时间很快&#xff0c;转眼间已经到数据结构的排序算法部分啦 今天我们来学习排序算法当中的 插入排序 和 …...

【JavaEE初阶】枫叶经霜艳,梅花透雪香-计算机是如何运行的?

本篇博客给大家带来的是与计算机相关的知识点, 包括:计算机的组成, 指令, 进程(重点). 文章专栏: JavaEE初阶 若有问题 评论区见 欢迎大家点赞 评论 收藏 分享 如果你不知道分享给谁,那就分享给薯条. 你们的支持是我不断创作的动力 . 1. 计算机的组成 1.1 计算机的发展史 计算…...

MySQL数据类型与存储结构

补充知识,事务隔离的等级&#xff1a; READ UNCOMMITTED&#xff08;读未提交&#xff09; &#xff1a;这是最低的隔离级别&#xff0c;允许事务读取其他事务未提交的数据&#xff0c;可能导致脏读、不可重复读和幻读问题。 ​ READ COMMITTED&#xff08;读已提交&#xff0…...

CSRF保护--laravel进阶篇

laravel对csrf非常重视&#xff0c;专门针对csrf作出了很多的保护。如果您是刚刚接触laravel的路由不久&#xff0c;那么您可能对于web.php路由文件的post请求很疑惑&#xff0c;因为get请求很顺利&#xff0c;而post请求则可能会遭遇失败。其中一个失败的原因是由于laravel的c…...

服务器数据恢复—raid5阵列+LVM+VXFS数据恢复案例

服务器存储数据恢复环境&#xff1a; 某品牌MSA2000FC存储中有一组由7块盘组建的RAID5阵列&#xff0c;另外还有1块硬盘作为热备盘使用。 基于RAID5阵列划分的几个LUN分配给小机使用&#xff0c;存储空间通过LVM管理&#xff0c;重要数据为Oracle数据库及OA服务端。 服务器存储…...

游卡,科锐国际,蓝禾,汤臣倍健,三七互娱,顺丰,快手,途游游戏25秋招内推

游卡&#xff0c;科锐国际&#xff0c;蓝禾&#xff0c;汤臣倍健&#xff0c;三七互娱&#xff0c;顺丰&#xff0c;快手&#xff0c;途游游戏25秋招内推 ①科锐国际25届秋招补录 人力资源类岗位&#xff0c;补录城市&#xff1a;苏州、宁波、武汉、东莞&#xff1b;全日制公办…...

内存不足引发C++程序闪退崩溃问题的分析与总结

目录 1、内存不足一般出现在32位程序中 2、内存不足时会导致malloc或new申请内存失败 2.1、malloc申请内存失败&#xff0c;返回NULL 2.2、new申请内存失败&#xff0c;抛出异常 3、内存不足项目实战案例中相关细节与要点说明 3.1、内存不足导致malloc申请内存失败&#…...

C++ 多态作业练习

作业1、 编写一个英雄类 class Hero{ int atk; int def; int spd; int hp; public: 所有的get set 方法 void equipWeapon(Weapon*) 根据传入的武器不同&#xff0c;英雄获得不同的属性加成 } #include <iostream> #include <cstring&g…...

(免费送源码)计算机毕业设计原创定制:Java+JSP+HTML+JQUERY+AJAX+MySQL springboot计算机类专业考研学习网站管理系统

摘 要 大数据时代下&#xff0c;数据呈爆炸式地增长。为了迎合信息化时代的潮流和信息化安全的要求&#xff0c;利用互联网服务于其他行业&#xff0c;促进生产&#xff0c;已经是成为一种势不可挡的趋势。在大学生在线计算机类专业考研学习网站管理的要求下&#xff0c;开发一…...

层次聚类(Hierarchical Clustering)详解

✅作者简介&#xff1a;2022年博客新星 第八。热爱国学的Java后端开发者&#xff0c;修心和技术同步精进。 &#x1f34e;个人主页&#xff1a;Java Fans的博客 &#x1f34a;个人信条&#xff1a;不迁怒&#xff0c;不贰过。小知识&#xff0c;大智慧。 &#x1f49e;当前专栏…...

Cannal实现MySQL主从同步环境搭建

大家好&#xff0c;我是袁庭新。 在多数情况下&#xff0c;客户端往往会优先获取缓存中的数据。然而&#xff0c;当缓存数据与数据库中的实际数据存在显著不一致时&#xff0c;可能会导致严重的后果。因此&#xff0c;确保数据库与缓存数据之间的一致性变得至关重要&#xff0c…...

Js-函数-03

函数定义 在java中我们为了提高代码的复用性&#xff0c;可以使用方法。同样&#xff0c;在JavaScript中可以使用函数来完成相同的事情。JavaScript中的函数被设计为执行特定任务的代码块&#xff0c;通过关键字function来定义。 <!DOCTYPE html> <html lang"en…...

9.机器学习--SVM支持向量机

支持向量机&#xff08;Support Vector Machine&#xff0c;SVM&#xff09;是一种二分类监督学习模型。支持向量机最早在 1964 年被提出&#xff0c;1995年前后理论成熟并开始被大量应用与人像识别、文本分类等问题中。它的基本模型是定义在特征空间上的间隔最大的线性分类器&…...

探索Python的HTTP之旅:揭秘Requests库的神秘面纱

文章目录 **探索Python的HTTP之旅&#xff1a;揭秘Requests库的神秘面纱**第一部分&#xff1a;背景介绍第二部分&#xff1a;Requests库是什么&#xff1f;第三部分&#xff1a;如何安装Requests库&#xff1f;第四部分&#xff1a;Requests库的五个简单函数使用方法第五部分&…...

vue3项目使用动态表单formcreate

使用两个插件&#xff1a; 支持可视化设计的低代码表单组件 | FormCreate 好用的低代码可视化表单设计器 | FcDesigner 一、安装 1.使用 Node.js 引入 npm install form-create/element-ui npm install form-create/designer^3 npm install element-plus 2. main.js引入…...

指针的奥秘:深入探索内存的秘密

前言 在计算机编程的广阔天地中&#xff0c;指针作为一种独特的数据类型&#xff0c;它不仅是C语言的核心&#xff0c;也是理解计算机内存管理的基石。指针的概念虽然强大&#xff0c;但对于初学者来说&#xff0c;它常常是学习过程中的一个难点。本文旨在揭开指针的神秘面纱&a…...

车载摄像camera基础知识和评估

一、车载摄像头应用 以下是根据图片内容重新制作的表格: | 序号 | 产品用途 |------|---------------- | 1 | AVM/环视360摄像头 | 2 | DMS摄像头 | 3 | IMS/OMS摄像头 | 4 | RVC摄像头 | 5 | 红外夜视摄像头 | 6 | 底盘透明摄像头 | 7 …...

OpenCV 图像轮廓查找与绘制全攻略:从函数使用到实战应用详解

摘要&#xff1a;本文详细介绍了 OpenCV 中用于查找图像轮廓的 cv2.findContours() 函数以及绘制轮廓的 cv2.drawContours() 函数的使用方法。涵盖 cv2.findContours() 各参数&#xff08;如 mode 不同取值对应不同轮廓检索模式&#xff09;及返回值的详细解析&#xff0c;搭配…...

微信小程序WXSS全局样式与局部样式的使用教程

微信小程序WXSS全局样式与局部样式的使用教程 引言 在微信小程序的开发中,样式的设计与实现是提升用户体验的关键部分。WXSS(WeiXin Style Sheets)作为微信小程序的样式表语言,不仅支持丰富的样式功能,还能通过全局样式与局部样式的灵活运用,帮助开发者构建美观且易于维…...

Leetcode142. 环形链表 II(HOT100)

链接 我的错误代码&#xff1a; class Solution { public:ListNode *detectCycle(ListNode *head) {if(!head||!head->next)return nullptr;ListNode* f head->next,*s head;while(f){f f->next,s s->next;if(!f)return nullptr;f f->next;if(fs){ListNo…...

Java程序基础⑤Java数组的定义和使用+引用的概念

目录 1. Java数组的基本概念 1.1 数组的定义 1.2 数组存在的意义 1.3 数组的使用 1.4 二维数组 2. 引用类型JVM的内存分布 2.1 JVM的内存分布 2.2 基本数据类型和引用型数据类型的区别 2.3 引用注意事项 2.4 传值传递 3. 数组总结和应用场景 3.1 一维数组和二维数组…...

丁真杯理塘大赛题解

前言&#xff1a;部分代码思路可能与题解思路不同&#xff0c;请勿强行带入 真蛰虫 原题链接 1.一道非常基础的数学题。 2.主要就是在考察分解质因数。首先看真蛰虫的质因数是不是包含了容器的所有质因数&#xff0c;如果没有&#xff0c;那么就不能放入容器中。如果全部包…...

FPGA经验谈系列文章——8、复位的设计

前言 剑法往往有着固定的招式套路,而写代码似乎也存在类似的情况。不知从何时起,众多 FPGA 工程师们在编写代码时开启了一种关于 always 语句块的流行写法,那就是: always @(posedge i_clk or negedge i_rstn) 就笔者所经历的诸多项目以及所接触到的不少工程师而言,大家在…...

Android studio与JS交互

文章目录 前言一、html二、使用步骤1.2.AS 总结 前言 最近在使用Android Studio的WebView,有些功能要AS与JS交互。 一、html html文件 <!DOCTYPE html> <html> <!--javascript--> <head><meta charset"utf-8"><title>Carson…...

健身房小程序服务渠道开展

健身不单单是锻炼身体、保持身材&#xff0c;也是一种社交方式&#xff0c;城市里门店不少&#xff0c;每家都有一定流量和老客&#xff0c;但仅靠传统线下拉客/自然流量前往和线上朋友圈、短视频发硬广等方式还不够。 商家需要找到更多潜在目标客户&#xff0c;而消费者也对门…...