Java 23 新特性解析与代码示例

Java 23 新特性解析与代码示例

文章目录

  • Java 23 新特性解析与代码示例
    • 1. 引言
    • 2. 正式特性
      • 2.1. Markdown文档注释 (JEP 467)
      • 2.2. 废弃sun.misc.Unsafe的内存访问方法以移除 (JEP 471)
      • 2.3. ZGC:默认启用代际模式 (JEP 474)
    • 3. 预览特性
      • 3.1. 原始类型在模式、instanceof和switch中的支持 (JEP 455)
      • 3.2. 类文件API (第二次预览) (JEP 466)
      • 3.3. 流收集器 (第二次预览) (JEP 473)
      • 3.4. 模块导入声明 (JEP 476)
      • 3.5. 隐式声明类和实例主方法 (第三次预览) (JEP 477)
      • 3.6. 结构化并发 (第三次预览) (JEP 480)
      • 3.7. 作用域值 (第三次预览) (JEP 481)
      • 3.8. 灵活的构造器体 (第二次预览) (JEP 482)
    • 4. 孵化特性
      • 4.1. 向量API (第八次孵化) (JEP 469)
    • 5. 结语

1. 引言

Java 23(JDK 23)于2024年9月17日正式发布,作为非长期支持(non-LTS)版本,它为开发者提供了探索最新特性的机会,同时为即将推出的长期支持版本(如Java 25,预计2025年9月发布)奠定基础。Java 23包含12个JDK增强提案(JEPs),分为3个正式特性、8个预览特性和1个孵化特性。这些特性涵盖了从文档编写到并发编程、性能优化的多个方面,旨在提升开发者生产力、代码可读性和程序性能。

本文将深入解析每个JEP,提供详细的背景说明、实际用途和完整的代码示例。对于优化现有功能的特性,我们将通过对比代码展示改进之处。预览特性需要使用--enable-preview标志启用,建议在非生产环境中测试并向Java社区提供反馈,以帮助完善这些功能。无论您是经验丰富的Java开发者还是初学者,本文都将为您提供实用的“干货”,让您能够快速上手Java 23的新特性。

在这里插入图片描述

2. 正式特性

2.1. Markdown文档注释 (JEP 467)

背景与用途

Java 23引入了Markdown文档注释(JEP 467),允许开发者使用Markdown语法编写Javadoc注释,替代传统的HTML和Javadoc标签混合格式。Markdown是一种简单易读的标记语言,广泛用于开源项目和文档编写。通过支持Markdown,Java 23简化了文档的编写和维护,提高了代码注释的可读性。

传统Javadoc与Markdown对比

在Java 22及之前,Javadoc注释通常使用HTML和Javadoc标签,例如:

/*** <p>计算一个数的阶乘。</p>* <ul>*   <li>输入必须为非负数。</li>*   <li>返回结果为long类型。</li>* </ul>* @param n 输入的整数* @return n的阶乘*/
public static long factorial(int n) {// ...
}

使用Markdown后,同样的注释可以简化为:

/*** 计算一个数的阶乘。** - 输入必须为非负数。* - 返回结果为long类型。* @param n 输入的整数* @return n的阶乘*/
public static long factorial(int n) {// ...
}

Markdown语法更直观,减少了HTML标签的复杂性。

使用方法

Markdown注释使用与传统Javadoc相同的/** */格式,内容遵循CommonMark标准,支持标题、列表、代码块、链接等。例如:

/*** # 阶乘计算器* ## 功能描述* 计算给定整数的阶乘。** **输入要求**:非负整数。* **输出**:`long`类型的阶乘结果。** 示例代码:* ```java* long result = factorial(5); // 返回120* ```
*
* 参考:[Java 23文档](https://docs.oracle.com/en/java/javase/23/javadoc/using-markdown-documentation-comments.html)
* @param n 输入的整数
* @return n的阶乘*/public static long factorial(int n) {if (n < 0) throw new IllegalArgumentException("输入必须为非负数");if (n == 0) return 1;return n * factorial(n - 1);}

优势

  • 可读性:Markdown语法简洁,易于阅读和编写。
  • 一致性:与开源社区常用的Markdown格式保持一致。
  • 工具支持:IntelliJ IDEA等IDE支持Markdown预览,生成HTML文档时效果一致。

注意事项

Markdown注释支持Javadoc标签(如@param@return),但在代码块中这些标签不会被解析。开发者可以混合使用Markdown和传统Javadoc标签,但需注意格式一致性。

参考:JEP 467

2.2. 废弃sun.misc.Unsafe的内存访问方法以移除 (JEP 471)

背景与用途

sun.misc.Unsafe是一个非标准API,提供了低级内存操作功能,但因其不安全性和缺乏官方支持,长期被视为问题来源。JEP 471将sun.misc.Unsafe的内存访问方法标记为废弃并计划在未来版本移除,鼓励开发者使用标准API,如VarHandleForeign Function & Memory API

传统使用与替代方案

在Java 22及之前,开发者可能使用sun.misc.Unsafe进行内存操作,例如:

import sun.misc.Unsafe;
import java.lang.reflect.Field;public class UnsafeExample {public static void main(String[] args) throws Exception {Field unsafeField = Unsafe.class.getDeclaredField("theUnsafe");unsafeField.setAccessible(true);Unsafe unsafe = (Unsafe) unsafeField.get(null);long address = unsafe.allocateMemory(8);unsafe.putLong(address, 12345L);System.out.println("Value: " + unsafe.getLong(address));unsafe.freeMemory(address);}
}

在Java 23中,上述代码会触发废弃警告。推荐使用VarHandle替代:

import java.lang.invoke.MethodHandles;
import java.lang.invoke.VarHandle;public class VarHandleExample {private long value;public static void main(String[] args) throws Exception {VarHandleExample obj = new VarHandleExample();VarHandle handle = MethodHandles.lookup().findVarHandle(VarHandleExample.class, "value", long.class);handle.set(obj, 12345L);System.out.println("Value: " + handle.get(obj));}
}

优势

  • 安全性VarHandle提供类型安全的内存访问。
  • 标准支持:作为Java标准API的一部分,VarHandle有官方支持和文档。
  • 未来兼容性:避免因sun.misc.Unsafe移除导致的代码失效。

注意事项

开发者需尽快迁移现有代码到标准API,以避免未来版本的兼容性问题。Foreign Function & Memory API(JEP 469)也为内存操作提供了更现代的替代方案。

参考:JEP 471

2.3. ZGC:默认启用代际模式 (JEP 474)

背景与用途

Z垃圾回收器(ZGC)是一个低延迟、可扩展的垃圾回收器,Java 23通过JEP 474将ZGC的代际模式设为默认。此模式通过区分年轻代和老年代优化内存管理,提高吞吐量和降低延迟。

传统ZGC与代际模式的对比

在Java 22及之前,ZGC默认使用非代际模式,需手动启用代际模式:

java -XX:+UseZGC -XX:+ZGenerational MyApp

在Java 23中,代际模式成为默认,无需额外标志:

java -XX:+UseZGC MyApp

使用示例

以下是一个简单的应用程序,展示ZGC的性能优势:

public class ZGCTest {public static void main(String[] args) {for (int i = 0; i < 1000000; i++) {new Object(); // 快速创建对象,触发垃圾回收}System.out.println("完成对象分配");}
}

运行时使用ZGC:

java -XX:+UseZGC ZGCTest

优势

  • 性能提升:代际模式通过分离年轻代和老年代,减少全堆扫描,提高回收效率。
  • 低延迟:ZGC的暂停时间通常在毫秒级,适合高性能应用。
  • 简化配置:默认启用代际模式,减少手动配置需求。

注意事项

代际模式可能增加内存占用,开发者需根据应用场景调整JVM参数。非代际模式仍可通过-XX:-ZGenerational启用,但不推荐。

参考:JEP 474

3. 预览特性

3.1. 原始类型在模式、instanceof和switch中的支持 (JEP 455)

背景与用途

JEP 455(预览特性)扩展了模式匹配功能,允许在instanceofswitch语句中使用原始类型,增强了代码的表达力和安全性。此特性消除了对原始类型进行装箱/拆箱的需求,并确保类型转换的安全性。

传统方式与新特性的对比

在Java 22及之前,instanceof仅支持引用类型,原始类型需手动检查:

Object obj = 42;
if (obj instanceof Integer) {Integer i = (Integer) obj;System.out.println("整数: " + i);
}

在Java 23中,可以直接使用原始类型模式:

Object obj = 42;
if (obj instanceof int i) {System.out.println("整数: " + i);
}

使用示例

instanceof示例

public class PrimitivePatternExample {public static void main(String[] args) {Object obj = 100;if (obj instanceof int i && i >= 0 && i <= 127) {System.out.println("可以安全转换为byte: " + (byte) i);} else {System.out.println("无法安全转换为byte");}}
}

switch示例

public class PrimitiveSwitchExample {public static void main(String[] args) {Object obj = 3.14;String result = switch (obj) {case int i -> "整数: " + i;case double d -> "双精度浮点数: " + d;default -> "未知类型";};System.out.println(result);}
}

启用方法

编译和运行时需启用预览特性:

javac --enable-preview --release 23 PrimitivePatternExample.java
java --enable-preview PrimitivePatternExample

优势

  • 安全性:避免不安全的类型转换,减少数据丢失风险。
  • 简洁性:减少装箱/拆箱操作,提高代码可读性。
  • 一致性:使原始类型和引用类型的模式匹配行为一致。

参考:JEP 455

3.2. 类文件API (第二次预览) (JEP 466)

背景与用途

JEP 466提供了一个标准API,用于解析、生成和转换Java类文件,替代第三方库(如ASM)。此API适用于编译器、字节码生成器和分析工具。

使用示例

以下示例展示如何使用类文件API解析类文件:

import jdk.incubator.classfile.*;public class ClassFileExample {public static void main(String[] args) throws Exception {ClassModel classModel = ClassFile.of().parse("MyClass.class".getBytes());for (MethodModel method : classModel.methods()) {System.out.println("方法: " + method.methodName().stringValue());}}
}

启用方法

作为孵化特性,需启用预览:

javac --enable-preview --release 23 ClassFileExample.java
java --enable-preview ClassFileExample

优势

  • 标准化:提供官方支持的类文件操作API。
  • 灵活性:支持字节码生成和转换,适合工具开发。
  • 未来性:替代不稳定的内部API和第三方库。

参考:JEP 466

3.3. 流收集器 (第二次预览) (JEP 473)

背景与用途

JEP 473引入了流收集器(Stream Gatherers),允许开发者定义自定义的流中间操作,增强Stream API的灵活性。

使用示例

以下是一个自定义收集器,将流分组为固定大小的子列表:

import java.util.stream.*;public class StreamGatherersExample {public static void main(String[] args) {Stream.of(1, 2, 3, 4, 5).gather(Gatherers.windowFixed(2)).forEach(System.out::println);}
}

输出:

[1, 2]
[3, 4]
[5]

启用方法

编译和运行时需启用预览特性:

javac --enable-preview --release 23 StreamGatherersExample.java
java --enable-preview StreamGatherersExample

优势

  • 灵活性:支持复杂的流操作。
  • 可读性:使数据处理逻辑更清晰。
  • 可扩展性:允许开发者自定义流处理逻辑。

参考:JEP 473

3.4. 模块导入声明 (JEP 476)

背景与用途

JEP 476允许通过单一导入语句导入模块导出的所有包,简化模块化应用的代码。

传统方式与新特性的对比

在Java 22及之前,需逐一导入包:

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

在Java 23中,可以使用模块导入:

import module java.sql;

使用示例

import module java.sql;public class ModuleImportExample {public static void main(String[] args) throws SQLException {Connection conn = DriverManager.getConnection("jdbc:sqlite:test.db");System.out.println("数据库连接成功");}
}

启用方法

编译和运行时需启用预览特性:

javac --enable-preview --release 23 ModuleImportExample.java
java --enable-preview ModuleImportExample

优势

  • 简洁性:减少导入语句的冗余。
  • 可维护性:简化模块化项目的代码管理。
  • 清晰性:明确模块依赖关系。

参考:JEP 476

3.5. 隐式声明类和实例主方法 (第三次预览) (JEP 477)

背景与用途

JEP 477旨在降低Java初学者的学习曲线,允许编写简化的类和主方法,省略繁琐的类声明。

传统方式与新特性的对比

传统Java程序:

public class HelloWorld {public static void main(String[] args) {System.out.println("Hello, World!");}
}

在Java 23中,可以简化为:

void main() {println("Hello, World!");
}

使用示例

void main() {List<String> names = List.of("Alice", "Bob");for (String name : names) {println("Hello, " + name + "!");}
}

启用方法

编译和运行时需启用预览特性:

javac --enable-preview --release 23 HelloWorld.java
java --enable-preview HelloWorld

优势

  • 初学者友好:简化程序结构,降低学习门槛。
  • 简洁性:减少样板代码。
  • 教学用途:适合教学和快速原型开发。

参考:JEP 477

3.6. 结构化并发 (第三次预览) (JEP 480)

背景与用途

JEP 480引入了结构化并发API,将相关任务视为一个工作单元,简化多线程编程,提高错误处理和任务取消的可靠性。

使用示例

以下示例展示如何并行执行任务并处理结果:

import java.util.concurrent.*;public class StructuredConcurrencyExample {public static void main(String[] args) throws Exception {try (var scope = new StructuredTaskScope.ShutdownOnFailure()) {Future<String> task1 = scope.fork(() -> "任务1结果");Future<String> task2 = scope.fork(() -> "任务2结果");scope.join().throwIfFailed();System.out.println(task1.resultNow() + ", " + task2.resultNow());}}
}

启用方法

编译和运行时需启用预览特性:

javac --enable-preview --release 23 StructuredConcurrencyExample.java
java --enable-preview StructuredConcurrencyExample

优势

  • 简化并发:将相关任务组织为一个单元。
  • 错误处理:统一处理任务失败。
  • 可观察性:提高并发代码的可维护性。

参考:JEP 480

3.7. 作用域值 (第三次预览) (JEP 481)

背景与用途

JEP 481引入了作用域值(Scoped Values),允许在线程及其子线程间共享不可变数据,替代线程局部变量,适合传递上下文数据。

使用示例

import jdk.incubator.concurrent.ScopedValue;public class ScopedValueExample {private static final ScopedValue<String> USER = ScopedValue.newInstance();public static void main(String[] args) throws Exception {ScopedValue.runWhere(USER, "Alice", () -> {System.out.println("当前用户: " + USER.get());});}
}

启用方法

编译和运行时需启用预览特性:

javac --enable-preview --release 23 ScopedValueExample.java
java --enable-preview ScopedValueExample

优势

  • 不可变性:确保数据安全。
  • 轻量级:比线程局部变量更高效。
  • 上下文传递:适合传递事务ID、用户信息等。

参考:JEP 481

3.8. 灵活的构造器体 (第二次预览) (JEP 482)

背景与用途

JEP 482允许在构造器中调用方法或执行逻辑,在调用this()super()之前,提高代码复用性。

传统方式与新特性的对比

在Java 22及之前,构造器中不能在this()super()之前调用实例方法:

class Point {int x, y;Point(int x, int y) {if (x < 0 || y < 0) {throw new IllegalArgumentException("坐标必须为非负数");}this.x = x;this.y = y;}
}

在Java 23中,可以提前调用验证方法:

class Point {int x, y;Point(int x, int y) {validate(x, y);this.x = x;this.y = y;}private void validate(int x, int y) {if (x < 0 || y < 0) {throw new IllegalArgumentException("坐标必须为非负数");}}
}

使用示例

class PositivePoint extends Point {PositivePoint(int x, int y) {if (x <= 0 || y <= 0) {throw new IllegalArgumentException("坐标必须为正数");}super(x, y);}
}

启用方法

编译和运行时需启用预览特性:

javac --enable-preview --release 23 PositivePoint.java
java --enable-preview PositivePoint

优势

  • 代码复用:减少构造器中的重复逻辑。
  • 灵活性:允许更复杂的初始化逻辑。
  • 可读性:使构造器代码更清晰。

参考:JEP 482

4. 孵化特性

4.1. 向量API (第八次孵化) (JEP 469)

背景与用途

JEP 469继续孵化向量API,允许开发者编写可编译为硬件优化的向量计算代码,适用于数值计算、机器学习等场景。

使用示例

以下示例计算两个数组的点积:

import jdk.incubator.vector.*;public class VectorAPIExample {private static final VectorSpecies<Float> SPECIES = FloatVector.SPECIES_256;public static void main(String[] args) {float[] a = {1.0f, 2.0f, 3.0f, 4.0f};float[] b = {5.0f, 6.0f, 7.0f, 8.0f};float result = 0.0f;FloatVector va = FloatVector.fromArray(SPECIES, a, 0);FloatVector vb = FloatVector.fromArray(SPECIES, b, 0);result = va.mul(vb).reduceLanes(VectorOperators.ADD);System.out.println("点积: " + result);}
}

启用方法

编译和运行时需启用预览特性:

javac --enable-preview --release 23 VectorAPIExample.java
java --enable-preview VectorAPIExample

优势

  • 性能优化:利用硬件向量指令提高计算效率。
  • 跨平台:在支持的硬件上自动优化。
  • 适用性:适合高性能计算场景。

参考:JEP 469

5. 结语

Java 23通过12个JEP为开发者带来了丰富的功能,从简化文档编写的Markdown支持到增强并发编程的结构化并发,再到性能优化的ZGC代际模式,这些特性显著提升了Java的开发体验和程序性能。正式特性可立即用于生产环境,而预览和孵化特性则为开发者提供了尝试尖端功能的机会,同时为未来的LTS版本(如Java 25)奠定基础。

我们鼓励开发者在非生产环境中测试预览特性,并通过OpenJDK社区提供反馈,以帮助完善这些功能。无论您是开发高性能应用、编写教学代码还是维护大型项目,Java 23的新特性都为您提供了强大的工具。立即下载JDK 23,探索这些新功能,并在您的项目中释放Java的潜力!

参考文献

JEP编号标题链接
455原始类型在模式、instanceof和switch中的支持 (预览)JEP 455
466类文件API (第二次预览)JEP 466
467Markdown文档注释JEP 467
469向量API (第八次孵化)JEP 469
471废弃sun.misc.Unsafe的内存访问方法以移除JEP 471
473流收集器 (第二次预览)JEP 473
474ZGC:默认启用代际模式JEP 474
476模块导入声明 (预览)JEP 476
477隐式声明类和实例主方法 (第三次预览)JEP 477
480结构化并发 (第三次预览)JEP 480
481作用域值 (第三次预览)JEP 481
482灵活的构造器体 (第二次预览)JEP 482

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

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

相关文章

spring boot + mybatis + mysql 只有一个实体类的demo

使用MyBatis进行数据库操作&#xff0c;配置简单。主要演示了mybatis可以不用只使用方法名来对应mapper.java和mapper.xml。 目录结构 pom.xml src/ ├── main/ │ ├── java/ │ │ └── com/ │ │ └── springbootjdbcweb/ │ │ └── …

iRemovalPro完美绕iCloud插卡打电话,A12+支持iOS 18.1.1

iRemovalPro 专业工具全解析与操作指南 &#xff08;支持iOS 14.0 - 16.6.1&#xff0c;A7-A15芯片设备&#xff09; &#x1f449;下载地址见文末 iRemoval Pro iRemoval 专业版是一款来自外国安全研究员的工具&#xff0c;用来帮助一些人因为忘记自己的ID或者密码&#xff0c…

安卓SELinux策略语法

目录前言一、 通用AV规则语法1.1 allow source target:class permissions;1.2 neverallow source target:class permissions;二、type三、attribute四、typeattribute五、alias六、typealias七、init_daemon_domain7.1 init_daemon_domain 宏概述7.2 宏展开与实现7.2.1 展开后规…

vscode cursor配置php的debug,docker里面debug

VSCode PHP调试配置指南 概述 本文介绍如何在VSCode中配置PHP调试环境&#xff0c;包括本地和Docker环境。 前置要求 VSCodePHP 7.0Xdebug扩展PHP Debug VSCode扩展 本地调试配置 1. 安装Xdebug # Ubuntu/Debian sudo apt-get install php-xdebug# MacOS brew install p…

elk部署加日志收集

清华大学镜像源地址&#xff1a;Index of /elasticstack/8.x/yum/8.13.2/ | 清华大学开源软件镜像站 | Tsinghua Open Source Mirror 一、elasticsearch 1.安装 rpm -ivh elastic-agent-8.13.2-x86_64.rpm 2.修改配置 vim /etc/elasticsearch/elasticsearch.yml 修改如下&…

dify 升级1.7.1 插件无法下载依赖

dify 升级1.7.1 插件无法下载依赖 1. 安装通义千问插件&#xff0c;各种报错&#xff1b; 使用下面命令查看docker 镜像日志 docker logs -f --tail100 docker-plugin_daemon-1 2025/08/01 07:42:21 full_duplex.go:59: [INFO]init environment for plugin langgenius/tongyi…

linux中简易云盘系统项目实战:基于 TCP协议的 Socket 通信、json数据交换、MD5文件区别与多用户文件管理实现

&#x1f4cb; 项目介绍 本项目是一个基于Linux环境的简易云盘系统&#xff0c;采用C/S&#xff08;客户端/服务器&#xff09;架构&#xff0c;实现了类似百度网盘的基本功能。系统通过TCP Socket进行网络通信&#xff0c;使用JSON格式进行数据交换&#xff0c;利用SQLite3数据…

linux中posix消息队列的使用记录

在linux中使用posix中的消息队列时遇到了一个问题&#xff0c;就是在发送消息时&#xff0c;如果队列满了&#xff0c;mq_send接口会一直阻塞&#xff0c;经过查找资料后才发现&#xff0c;该接口默认是阻塞的&#xff0c;也就是说&#xff0c;当队列满了以后&#xff0c;接口会…

01 基于sklearn的机械学习-机械学习的分类、sklearn的安装、sklearn数据集及数据集的划分、特征工程(特征提取与无量纲化、特征降维)

文章目录机械学习机械学习分类1. 监督学习2. 半监督学习3. 无监督学习4. 强化学习机械学习的项目开发步骤scikit-learn1 scikit-learn安装2 sklearn数据集1. sklearn 玩具数据集鸢尾花数据集糖尿病数据集葡萄酒数据集2. sklearn现实世界数据集20 新闻组数据集3. 数据集的划分特…

n8n】n8n的基础概念

以下是为初学者整理的 n8n 基本概念总结&#xff0c;帮助快速理解核心功能和使用逻辑&#xff1a;1. 工作流&#xff08;Workflow&#xff09;核心单元&#xff1a;n8n的一切操作基于工作流&#xff0c;代表一个自动化流程。组成&#xff1a;由多个节点&#xff08;Nodes&#…

机器学习基础-matplotlib

一、相关知识点二、plotfrom pylab import mpl # 设置显示中文字体 mpl.rcParams["font.sans-serif"] ["SimHei"] # 设置正常显示符号 mpl.rcParams["axes.unicode_minus"] False #%%#%% import matplotlib.pyplot as plt import random# 画出…

spring-ai-alibaba 学习(十九)——graph之条件边、并行节点、子图节点

前面了解了基础的概念及流程&#xff0c;以及一些参数类下面了解一些特殊的边和节点条件边常见的流程图可能长这个样子&#xff1a;其中菱形的为条件节点&#xff08;或者叫判定节点&#xff09;&#xff0c;但是在spring-ai-alibaba-graph中&#xff0c;并没有条件节点在sprin…

深入浅出设计模式——创建型模式之原型模式 Prototype

文章目录原型模式简介原型模式结构关于克隆方法&#xff1a;浅拷贝/深拷贝原型模式代码实例定义原型类和克隆方法客户端使用代码示例示例一&#xff1a;浅拷贝示例二&#xff1a;深拷贝原型模式总结开闭原则代码仓库原型模式&#xff1a;用原型实例指定创建对象的种类&#xff…

.NET 10 中的新增功能系列文章3—— .NET MAUI 中的新增功能

.NET 10 预览版 6 中的 .NET MAUI.NET 10 预览版 5 中的.NET MAUI.NET 10 预览版 4 中的 .NET MAUI.NET 10 预览版 3 中的 .NET MAUI.NET 10 预览版 2 中的 .NET MAUI.NET 10 预览版 1 中的 .NET MAUI 一、MediaPicker 增强功能&#xff08;预览版6&#xff09; .NET 10 预览…

MT Photos图库部署详解:Docker搭建+贝锐蒲公英异地组网远程访问

如今&#xff0c;私有化部署轻量级图床/图库系统&#xff0c;已经成为越来越多用户的高频需求。而MT Photos&#xff0c;正是一款非常适合在Docker环境下运行的自托管图床/图库系统。MT Photos基于Node.js与Vue构建&#xff0c;界面简洁美观&#xff0c;支持多用户权限管理、多…

解决dbeaver连接不上oceanbase数据库的问题

解决dbeaver连接不上oceanbase数据库的问题 问题&#xff1a; 使用dbeaver连接oceanbase数据库报错如下&#xff1a; ORA-00900: You have an error in your SQL syntax; check the manual that corresponds to your OceanBase version for the right syntax to use near ‘dat…

Kafka——请求是怎么被处理的?

引言在分布式消息系统中&#xff0c;请求处理机制是连接客户端与服务端的"神经中枢"。无论是生产者发送消息、消费者拉取数据&#xff0c;还是集群内部的元数据同步&#xff0c;都依赖于高效的请求处理流程。Apache Kafka作为高性能消息队列的代表&#xff0c;其请求…

区块链技术如何确保智能合约的安全性和可靠性?

智能合约作为区块链上自动执行的可编程协议&#xff0c;其安全性和可靠性直接决定了区块链应用的信任基础。区块链通过底层技术架构、密码学工具和机制设计的多重保障&#xff0c;构建了智能合约的安全防线。以下从技术原理、核心机制和实践保障三个维度展开分析&#xff1a;一…

2020 年 NOI 最后一题题解

问题描述2020 年 NOI 最后一题是一道结合图论、动态规划与状态压缩的综合性算法题&#xff0c;题目围绕 "疫情期间的物资配送" 展开&#xff0c;具体要求如下&#xff1a;给定一个有向图 G (V, E)&#xff0c;其中节点代表城市&#xff0c;边代表连接城市的道路。每个…

加密与安全

目录 一、URL编码&#xff1a; 二、Base64编码&#xff1a; 三、哈希算法&#xff1a; 四、Hmac算法&#xff1a; 五、对称加密算法&#xff1a; 一、URL编码&#xff1a; URL编码是浏览器发送数据给服务器时使用的编码&#xff0c;它通常附加在URL的参数部分。之所以需要…