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

Java四大常用JSON解析性能对比:Hutool、Fastjson2、Gson与Jackson测试

1. 引言

JSON 是现代软件开发中常用的数据交换格式,尤其在微服务和前后端分离的架构中更是必不可少。
本文将对 Java 中四大主流 JSON 解析库——Hutool、Fastjson2、Gson 和 Jackson 进行性能测试和对比分析,通过实测 20 万条数据解析,揭示各库在批量和逐条处理中的表现。

测试结果仅供参考!!! 请多次测试再抉择


2. 环境与依赖

2.1 环境信息
  • 操作系统:Window11
  • JDK 版本:jdk1.8.0_281
  • CPU :  AMD Ryzen 9 7945HX
  • 内存:32GB
2.2 Maven依赖

在项目的 pom.xml 文件中引入以下依赖:

      <!-- https://mvnrepository.com/artifact/com.google.code.gson/gson --><dependency><groupId>com.google.code.gson</groupId><artifactId>gson</artifactId><version>2.10.1</version></dependency><!-- https://mvnrepository.com/artifact/com.alibaba.fastjson2/fastjson2 --><dependency><groupId>com.alibaba.fastjson2</groupId><artifactId>fastjson2</artifactId><version>2.0.52</version></dependency><!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind --><dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId><version>2.14.2</version></dependency><dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.8.35</version></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></dependency>

3. 测试代码

3.1 数据模型

定义一个简单的实体对象:

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;/*** @author 阿水*/
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Variable {private int id;private String name;private double value;private String description;private String type;
}

3.2 测试数据生成

模拟 20 万条数据用于测试:

  // 生成测试数据public static List<Variable> generateData(int size) {List<Variable> list = new ArrayList<>(size);for (int i = 0; i < size; i++) {Variable data = new Variable();data.setId(i);data.setName("Name" + i);data.setValue(Math.random() * 1000);data.setDescription(IdUtil.fastSimpleUUID());data.setType(IdUtil.fastSimpleUUID()+i);list.add(data);}return list;}
3.3 四大库序列化与反序列化测试
import cn.hutool.core.util.IdUtil;
import cn.hutool.json.JSONUtil;
import com.alibaba.fastjson2.JSON;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
import lombok.extern.slf4j.Slf4j;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;/*** @description: JSON 序列化、解析性能测试* @author 阿水*/
@Slf4j
public class JsonBenchmarkTest {//数据总条数public static int dataSize = 200000;//测试次数public static  int iterations = 10;public static void main(String[] args) throws Exception {// 生成测试数据List<Variable> testData = generateData(dataSize);log.info("测试数据总条数为: {} 条", dataSize);log.info("以下测试结果均为进行 {} 次计算之后,耗费时间取平均值计算得出。", iterations);// 序列化测试String jsonString = serializationTest(testData);log.info("JSON 数据总大小为: {} 字节", jsonString.length());// 批量解析测试log.info("===== 使用批量解析 JSON(即解析集合API)=====");batchParseTest(jsonString);// 单条解析测试log.info("===== 循环遍历逐个解析 JSON API =====");singleParseTest(jsonString);// 单条解析并插入集合测试log.info("===== 循环遍历逐个解析 JSON并插入集合 API=====");singleParseAndAddListTest(jsonString);}// 生成测试数据public static List<Variable> generateData(int size) {List<Variable> list = new ArrayList<>(size);for (int i = 0; i < size; i++) {Variable data = new Variable();data.setId(i);data.setName("Name" + i);data.setValue(Math.random() * 1000);data.setDescription(IdUtil.fastSimpleUUID());data.setType(IdUtil.fastSimpleUUID()+i);list.add(data);}return list;}/*** 序列化测试*/private static String serializationTest(List<Variable> testData) throws Exception {String jsonResult = null;// Hutoollong hutoolTotal = 0;for (int i = 0; i < iterations; i++) {long start = System.currentTimeMillis();String hutoolJson = JSONUtil.toJsonStr(testData);long end = System.currentTimeMillis();hutoolTotal += (end - start);if (i == 0) jsonResult = hutoolJson; // 保存结果}log.info("HuTool 序列化平均耗时: {} ms", hutoolTotal / iterations);// Fastjson2long fastjsonTotal = 0;for (int i = 0; i < iterations; i++) {long start = System.currentTimeMillis();String fastjsonJson = JSON.toJSONString(testData);long end = System.currentTimeMillis();fastjsonTotal += (end - start);}log.info("Fastjson2 序列化平均耗时: {} ms", fastjsonTotal / iterations);// GsonGson gson = new Gson();long gsonTotal = 0;for (int i = 0; i < iterations; i++) {long start = System.currentTimeMillis();String gsonJson = gson.toJson(testData);long end = System.currentTimeMillis();gsonTotal += (end - start);}log.info("Gson 序列化平均耗时: {} ms", gsonTotal / iterations);// JacksonObjectMapper objectMapper = new ObjectMapper();long jacksonTotal = 0;for (int i = 0; i < iterations; i++) {long start = System.currentTimeMillis();String jacksonJson = objectMapper.writeValueAsString(testData);long end = System.currentTimeMillis();jacksonTotal += (end - start);}log.info("Jackson 序列化平均耗时: {} ms", jacksonTotal / iterations);return jsonResult;}/*** 批量解析测试*/private static void batchParseTest(String jsonString) throws Exception {// Hutoollong hutoolTotal = 0;for (int i = 0; i < iterations; i++) {long start = System.currentTimeMillis();List<Variable> result = JSONUtil.toList(JSONUtil.parseArray(jsonString), Variable.class);long end = System.currentTimeMillis();hutoolTotal += (end - start);}log.info("HuTool 批量解析平均耗时: {} ms", hutoolTotal / iterations);// Fastjson2long fastjsonTotal = 0;for (int i = 0; i < iterations; i++) {long start = System.currentTimeMillis();List<Variable> result = JSON.parseArray(jsonString, Variable.class);long end = System.currentTimeMillis();fastjsonTotal += (end - start);}log.info("Fastjson2 批量解析平均耗时: {} ms", fastjsonTotal / iterations);// GsonGson gson = new Gson();long gsonTotal = 0;for (int i = 0; i < iterations; i++) {long start = System.currentTimeMillis();List<Variable> result = gson.fromJson(jsonString, new TypeToken<List<Variable>>() {}.getType());long end = System.currentTimeMillis();gsonTotal += (end - start);}log.info("Gson 批量解析平均耗时: {} ms", gsonTotal / iterations);// JacksonObjectMapper objectMapper = new ObjectMapper();long jacksonTotal = 0;for (int i = 0; i < iterations; i++) {long start = System.currentTimeMillis();List<Variable> result = objectMapper.readValue(jsonString, new TypeReference<List<Variable>>() {});long end = System.currentTimeMillis();jacksonTotal += (end - start);}log.info("Jackson 批量解析平均耗时: {} ms", jacksonTotal / iterations);}/*** 单条解析测试*/private static void singleParseTest(String jsonString) throws Exception {List<String> messageList = JSON.parseArray(jsonString, Variable.class).stream().map(JSON::toJSONString).collect(Collectors.toList());// Hutoollong hutoolTotal = 0;for (int i = 0; i < iterations; i++) {long start = System.currentTimeMillis();for (String msg : messageList) {Variable v = JSONUtil.toBean(msg, Variable.class);}long end = System.currentTimeMillis();hutoolTotal += (end - start);}log.info("HuTool 单条解析平均耗时: {} ms", hutoolTotal / iterations);// Fastjson2long fastjsonTotal = 0;for (int i = 0; i < iterations; i++) {long start = System.currentTimeMillis();for (String msg : messageList) {Variable v = JSON.parseObject(msg, Variable.class);}long end = System.currentTimeMillis();fastjsonTotal += (end - start);}log.info("Fastjson2 单条解析平均耗时: {} ms", fastjsonTotal / iterations);// GsonGson gson = new Gson();long gsonTotal = 0;for (int i = 0; i < iterations; i++) {long start = System.currentTimeMillis();for (String msg : messageList) {Variable v = gson.fromJson(msg, Variable.class);}long end = System.currentTimeMillis();gsonTotal += (end - start);}log.info("Gson 单条解析平均耗时: {} ms", gsonTotal / iterations);// JacksonObjectMapper objectMapper = new ObjectMapper();long jacksonTotal = 0;for (int i = 0; i < iterations; i++) {long start = System.currentTimeMillis();for (String msg : messageList) {Variable v = objectMapper.readValue(msg, Variable.class);}long end = System.currentTimeMillis();jacksonTotal += (end - start);}log.info("Jackson 单条解析平均耗时: {} ms", jacksonTotal / iterations);}/*** 循环遍历单条解析并插入集合测试*//*** 循环遍历单条解析并插入集合测试 (平均耗时计算)*/static void singleParseAndAddListTest(String jsonString) throws Exception {// 转换为模拟 MQ 消息体List<String> messageList = JSON.parseArray(jsonString, Variable.class).stream().map(JSON::toJSONString) // 将每个对象转为 JSON 字符串模拟单条消息.collect(Collectors.toList());// 平均耗时变量定义double hutoolTotalTime = 0;double fastjsonTotalTime = 0;double gsonTotalTime = 0;double jacksonTotalTime = 0;// 循环 10 次计算平均耗时for (int i = 0; i < iterations; i++) {// 1. Hutool JSONUtil 单条解析List<Variable> hutoolList = new ArrayList<>();long hutoolStart = System.currentTimeMillis();for (String msg : messageList) {Variable v = JSONUtil.toBean(msg, Variable.class);hutoolList.add(v); // 将对象存入集合}long hutoolEnd = System.currentTimeMillis();hutoolTotalTime += (hutoolEnd - hutoolStart);// 2. Fastjson2 单条解析List<Variable> fastjsonList = new ArrayList<>();long fastjsonStart = System.currentTimeMillis();for (String msg : messageList) {Variable v = JSON.parseObject(msg, Variable.class);fastjsonList.add(v);}long fastjsonEnd = System.currentTimeMillis();fastjsonTotalTime += (fastjsonEnd - fastjsonStart);// 3. Gson 单条解析List<Variable> gsonList = new ArrayList<>();Gson gson = new Gson();long gsonStart = System.currentTimeMillis();for (String msg : messageList) {Variable v = gson.fromJson(msg, Variable.class);gsonList.add(v);}long gsonEnd = System.currentTimeMillis();gsonTotalTime += (gsonEnd - gsonStart);// 4. Jackson 单条解析List<Variable> jacksonList = new ArrayList<>();ObjectMapper objectMapper = new ObjectMapper();long jacksonStart = System.currentTimeMillis();for (String msg : messageList) {Variable v = objectMapper.readValue(msg, Variable.class);jacksonList.add(v);}long jacksonEnd = System.currentTimeMillis();jacksonTotalTime += (jacksonEnd - jacksonStart);}// 输出平均耗时结果log.info("HuTool 单条解析并存入集合平均耗时: {} ms", hutoolTotalTime / iterations);log.info("Fastjson2 单条解析并存入集合平均耗时: {} ms", fastjsonTotalTime / iterations);log.info("Gson 单条解析并存入集合平均耗时: {} ms", gsonTotalTime / iterations);log.info("Jackson 单条解析并存入集合平均耗时: {} ms", jacksonTotalTime / iterations);}}

4. 20W条数据、31098673字节测试结果分析(仅供参考 仅供参考 仅供参考 !!!

库名称序列化+反序列化总耗时性能排名
Fastjson2110ms左右🥇 第一名
Jackson170ms左右🥈 第二名
Gson210ms左右🥉 第三名
Hutool1800ms左右第四名


5. 性能分析与总结

测试结果分析
  1. Fastjson2

    • 性能表现: 测试结果中,无论是批量解析、逐条解析还是逐条解析并插入集合,它的速度都是最快的(30ms、39ms、39.8ms)。
    • 特性优势: 支持复杂对象结构解析,API 设计简洁高效,并修复了旧版 Fastjson 的反序列化漏洞,安全性更高。
    • 适用场景: 高并发、大数据量处理及性能敏感型应用场景。
  2. Hutool

    • 性能表现: 表现最慢,尤其在批量解析(637ms)和逐条解析(589ms)中远落后于其他库。
    • 特性优势: API 优雅轻便,开发效率高,但性能瓶颈明显,不适合超大规模数据解析。
    • 适用场景: 适合中小规模项目的快速开发,便捷性优先于性能要求的场合。
  3. Jackson

    • 性能表现: 表现较优,解析速度仅次于 Fastjson2(78ms、101ms、99.8ms),兼顾性能与功能复杂性。
    • 特性优势: 支持复杂 Java 对象和自定义配置,兼容性强,适合复杂数据结构映射需求。
    • 适用场景: 企业级应用、大型复杂系统开发及对灵活性要求高的项目。
  4. Gson

    • 性能表现: 性能优于 Hutool,但低于 Fastjson2 和 Jackson(93ms、119ms、119.5ms)。
    • 特性优势: API 简单直观,开发成本低,但在大数据量或高并发处理时性能表现不够理想。
    • 适用场景: 小规模数据解析需求,或对性能要求不高的任务。

6. 推荐选择

需求类型推荐库适用场景描述
性能优先Fastjson2在所有测试场景中速度最快,适合高性能和高并发场景,适合日志分析、大数据处理和消息队列数据解析等应用。
轻量便捷Hutool更适合中小规模项目的快速开发,虽然性能较低,但 API 优雅轻便,适合便捷性优先的场合。
功能复杂需求Jackson兼顾性能与灵活性,支持复杂数据结构和自定义配置,适合大型企业级应用或复杂对象映射需求。
简单解析需求GsonAPI 简洁易用,适合小规模数据解析任务,学习成本低,但不适合大数据和高并发需求。

7. 结论与建议

  1. Fastjson2:

    • 性能最高,适合高并发与大数据处理需求。
    • 安全性较高,是性能敏感应用的首选。
  2. Hutool:

    • 开发便捷但性能较低,适合中小规模项目。
    • 如果对开发效率要求高且数据量适中,可以选择它。
  3. Jackson:

    • 性能与灵活性兼顾,适合复杂对象和企业级系统
    • 面向需要自定义解析规则的场景表现更出色。
  4. Gson:

    • 简单易用但性能低于 Fastjson2 和 Jackson。
    • 适合小型项目或对性能要求不高的场合。

注意事项

  1. 安全性: Fastjson2 安全性最佳,其他库需关注版本更新,以避免反序列化漏洞。
  2. 兼容性: Jackson 在跨平台兼容性和复杂结构处理方面表现更佳。
  3. 性能评估: 项目正式使用前,应基于实际生产环境进行更大规模的性能测试和压力测试。

仅当前测试数据明确显示:

  • Fastjson2 性能最佳,适合高性能需求。
  • Hutool 性能最慢,更适合便捷开发而非大规模数据解析。
  • Jackson 在性能和灵活性之间取得平衡,适合复杂应用场景。
  • Gson 表现优于 Hutool,但略逊于 Fastjson2 和 Jackson,适合轻量级需求。

相关文章:

Java四大常用JSON解析性能对比:Hutool、Fastjson2、Gson与Jackson测试

1. 引言 JSON 是现代软件开发中常用的数据交换格式&#xff0c;尤其在微服务和前后端分离的架构中更是必不可少。 本文将对 Java 中四大主流 JSON 解析库——Hutool、Fastjson2、Gson 和 Jackson 进行性能测试和对比分析&#xff0c;通过实测 20 万条数据解析&#xff0c;揭示…...

Qt 5.14.2 学习记录 —— 일 新项目

文章目录 1、创建2、查看代码 ---- main.cpp3、查看代码 ---- widgt.h4、查看代码 ---- widgt.cpp和widget.ui5、查看代码 ---- Empty.pro6、运行产生的中间文件 1、创建 左上角的文件&#xff0c;新建文件或项目。如果要写一个GUI程序&#xff0c;应当选择Application&#x…...

uni-app:实现普通选择器,时间选择器,日期选择器,多列选择器

效果 选择前效果 1、时间选择器 2、日期选择器 3、普通选择器 4、多列选择器 选择后效果 代码 <template><!-- 时间选择器 --><view class"line"><view classitem1><view classleft>时间</view><view class"right&quo…...

Unity3D仿星露谷物语开发17之空库存栏UI

1、目标 将库存栏放在游戏界面中&#xff0c;一般情况下角色居中展示时库存栏在底部&#xff0c;当角色位于界面下方时库存栏展示在顶部避免遮挡。 2、CanvasGroup组件 用于集中控制UI元素的透明度、交互性和射线投射行为。CanvasGroup的Alpha属性允许渐变效果&#xff0c;I…...

QT------模型/视图

一、模型/视图结构概述 基本原理&#xff1a; Qt 的模型/视图&#xff08;Model/View&#xff09;架构将数据的存储和显示分离&#xff0c;提高了代码的可维护性和复用性。模型&#xff08;Model&#xff09;&#xff1a;负责存储和管理数据&#xff0c;提供数据的访问接口&am…...

Git - 记录一次由于少输入了一个命令导致的更改丢失

Git - 记录一次由于少输入了一个参数导致的更改丢失 前言 某晚我激情开发了几个小时&#xff0c;中途没有进行commit存档。准备睡觉时&#xff0c;我想创建一个新的分支并将今晚所有更改提交到新分支上&#xff08;似乎应该开发时候就创建&#xff1f;&#xff09;。 然后因…...

nodeJS下npm和yarn的关系和区别详解

一、命令对应关系 1. 初始化项目 操作npm 命令Yarn 命令初始化项目npm inityarn init跳过提问快速初始化npm init -yyarn init -y 2. 安装依赖 操作npm 命令Yarn 命令安装项目所有依赖npm installyarn install添加依赖npm install <package-name>yarn add <package…...

党员学习交流平台

本文结尾处获取源码。 本文结尾处获取源码。 本文结尾处获取源码。 一、相关技术 后端&#xff1a;Java、JavaWeb / Springboot。前端&#xff1a;Vue、HTML / CSS / Javascript 等。数据库&#xff1a;MySQL 二、相关软件&#xff08;列出的软件其一均可运行&#xff09; I…...

HTML5 文件上传(File Upload)详解

HTML5 文件上传&#xff08;File Upload&#xff09;详解 HTML5 提供了强大的文件上传功能&#xff0c;允许用户通过网页选择文件并上传到服务器。以下是关于文件上传控件的详细说明。 1. 基本的文件上传控件 使用 <input> 标签的 type"file" 属性可以创建一…...

1.2.1-2部分数据结构的说明02_链表

&#xff08;1&#xff09;链表数据结构&#xff1a; 概念&#xff1a; 将列表中相互连接的节点不连续的存储在内存中。与数据不同&#xff0c;我们无法再恒定时间内访问任何元组&#xff0c;如果遍历所有则花费时间与元素总数n成正比。插入和删除1个元素的时间复杂度都是O(n…...

vue elementUI Plus实现拖拽流程图,不引入插件,纯手写实现。

vue elementUI Plus实现拖拽流程图&#xff0c;不引入插件&#xff0c;纯手写实现。 1.设计思路&#xff1a;2.设计细节3.详细代码实现 1.设计思路&#xff1a; 左侧button列表是要拖拽的组件。中间是拖拽后的流程图。右侧是拖拽后的数据列表。 我们拖动左侧组件放入中间的流…...

linux上使用cmake编译的方法

一、hello 例程仅基于一个cpp文件 C文件或工程进行编译时可以使用g指令&#xff08;需要对每一个程序和源文件分别使用g指令编译&#xff09;&#xff0c;当程序变大时&#xff0c;一个工程文件往往会包含很文件夹和源文件&#xff0c;这时我们需要的编译指令将越来越长&#…...

如何实现el-select多选下拉框中嵌套复选框并加校验不为空功能呢?

如何实现el-select多选下拉框中嵌套复选框并加校验不为空功能呢&#xff1f; 要实现的效果图选择部分品牌但不选选项效果问题概述实现方案el-select组件与el-checkbox组件无缝衔接给form表单加自定义校验规则 要实现的效果图 选择部分品牌但不选选项效果 问题概述 相信大家看到…...

源码理解 UE4中的 FCookStatsManager::FAutoRegisterCallback RegisterCookStats

官方文档&#xff1a;https://dev.epicgames.com/documentation/zh-cn/unreal-engine/API/Runtime/Core/ProfilingDebugging/FCookStatsManager文档中的注释&#xff1a; When a cook a complete that is configured to use stats (ENABLE_COOK_STATS), it will broadcast this…...

Android 根据内存大小显示MTP模式连接PC时的名称

项目有两种内存&#xff0c;要求根据连接电脑拷贝文件时的盘符名称根据内存大小显示不同名称。 frameworks/base/media/java/android/mtp/MtpDatabase.java//mh import android.app.ActivityManager; ...-894,7 896,19 public class MtpDatabase implements AutoCloseable {p…...

不只是mini-react第一节:实现最简单mini-react

项目总结构&#xff1a; ├─ &#x1f4c1;core │ ├─ &#x1f4c4;React.js │ └─ &#x1f4c4;ReactDom.js ├─ &#x1f4c1;node_modules ├─ &#x1f4c1;tests │ └─ &#x1f4c4;createElement.spec.js ├─ &#x1f4c4;App.js ├─ &#x1f4c4;in…...

前端路由layout布局处理以及菜单交互(三)

上篇介绍了前端项目部署以及基本依赖的应用&#xff0c;这次主要对于路由以及布局进行模块化处理 一、 创建layout模块 1、新建src/layout/index.vue <template><el-container class"common-layout"><!-- <el-aside class"aside">&l…...

小结:DNS,HTTP,SMTP,IMAP,FTP,Telnet,TCP,ARP,ICMP

DNS&#xff08;Domain Name System&#xff0c;域名系统&#xff09; 是互联网的重要组成部分&#xff0c;它负责将人类易读的域名&#xff08;如 www.google.com&#xff09;转换为机器可以识别的 IP 地址&#xff08;如 142.250.72.206&#xff09;。这一过程被称为域名解析…...

【C++】P2550 [AHOI2001] 彩票摇奖

博客主页&#xff1a; [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: C 文章目录 &#x1f4af;前言&#x1f4af;题目描述输入格式&#xff1a;输出格式&#xff1a;输入输出样例&#xff1a; &#x1f4af;题解思路1. 问题解析 &#x1f4af;我的实现实现逻辑问题分析 &#x1f4af;老…...

并发服务器框架——zinx

zinx框架 Zinx 是一个用 Go 语言编写的高性能、轻量级的 TCP 服务器框架&#xff0c;它被设计为简单、快速且易于使用。Zinx 提供了一系列的功能&#xff0c;包括但不限于连接管理、数据编解码、业务处理、负载均衡等&#xff0c;适用于构建各种 TCP 网络服务&#xff0c;如游戏…...

接口测试中缓存处理策略

在接口测试中&#xff0c;缓存处理策略是一个关键环节&#xff0c;直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性&#xff0c;避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明&#xff1a; 一、缓存处理的核…...

网络六边形受到攻击

大家读完觉得有帮助记得关注和点赞&#xff01;&#xff01;&#xff01; 抽象 现代智能交通系统 &#xff08;ITS&#xff09; 的一个关键要求是能够以安全、可靠和匿名的方式从互联车辆和移动设备收集地理参考数据。Nexagon 协议建立在 IETF 定位器/ID 分离协议 &#xff08;…...

脑机新手指南(八):OpenBCI_GUI:从环境搭建到数据可视化(下)

一、数据处理与分析实战 &#xff08;一&#xff09;实时滤波与参数调整 基础滤波操作 60Hz 工频滤波&#xff1a;勾选界面右侧 “60Hz” 复选框&#xff0c;可有效抑制电网干扰&#xff08;适用于北美地区&#xff0c;欧洲用户可调整为 50Hz&#xff09;。 平滑处理&…...

以下是对华为 HarmonyOS NETX 5属性动画(ArkTS)文档的结构化整理,通过层级标题、表格和代码块提升可读性:

一、属性动画概述NETX 作用&#xff1a;实现组件通用属性的渐变过渡效果&#xff0c;提升用户体验。支持属性&#xff1a;width、height、backgroundColor、opacity、scale、rotate、translate等。注意事项&#xff1a; 布局类属性&#xff08;如宽高&#xff09;变化时&#…...

MongoDB学习和应用(高效的非关系型数据库)

一丶 MongoDB简介 对于社交类软件的功能&#xff0c;我们需要对它的功能特点进行分析&#xff1a; 数据量会随着用户数增大而增大读多写少价值较低非好友看不到其动态信息地理位置的查询… 针对以上特点进行分析各大存储工具&#xff1a; mysql&#xff1a;关系型数据库&am…...

渗透实战PortSwigger靶场-XSS Lab 14:大多数标签和属性被阻止

<script>标签被拦截 我们需要把全部可用的 tag 和 event 进行暴力破解 XSS cheat sheet&#xff1a; https://portswigger.net/web-security/cross-site-scripting/cheat-sheet 通过爆破发现body可以用 再把全部 events 放进去爆破 这些 event 全部可用 <body onres…...

oracle与MySQL数据库之间数据同步的技术要点

Oracle与MySQL数据库之间的数据同步是一个涉及多个技术要点的复杂任务。由于Oracle和MySQL的架构差异&#xff0c;它们的数据同步要求既要保持数据的准确性和一致性&#xff0c;又要处理好性能问题。以下是一些主要的技术要点&#xff1a; 数据结构差异 数据类型差异&#xff…...

学习STC51单片机31(芯片为STC89C52RCRC)OLED显示屏1

每日一言 生活的美好&#xff0c;总是藏在那些你咬牙坚持的日子里。 硬件&#xff1a;OLED 以后要用到OLED的时候找到这个文件 OLED的设备地址 SSD1306"SSD" 是品牌缩写&#xff0c;"1306" 是产品编号。 驱动 OLED 屏幕的 IIC 总线数据传输格式 示意图 …...

12.找到字符串中所有字母异位词

&#x1f9e0; 题目解析 题目描述&#xff1a; 给定两个字符串 s 和 p&#xff0c;找出 s 中所有 p 的字母异位词的起始索引。 返回的答案以数组形式表示。 字母异位词定义&#xff1a; 若两个字符串包含的字符种类和出现次数完全相同&#xff0c;顺序无所谓&#xff0c;则互为…...

vue3+vite项目中使用.env文件环境变量方法

vue3vite项目中使用.env文件环境变量方法 .env文件作用命名规则常用的配置项示例使用方法注意事项在vite.config.js文件中读取环境变量方法 .env文件作用 .env 文件用于定义环境变量&#xff0c;这些变量可以在项目中通过 import.meta.env 进行访问。Vite 会自动加载这些环境变…...