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

Java 18~20 新特性

文章目录

  • 一、Java 18 新特性
    • 1.1、UTF-8 作为默认字符集(JEP 400)
    • 1.2、简易 Web 服务器(JEP 408)
    • 1.3、代码片段标签 `@snippet`(JEP 413)
    • 1.4、使用方法句柄重新实现反射核心(JEP 416)
    • 1.5、向量 API(JEP 417,第三次孵化)
    • 1.6、Internet-Address 解析 SPI(JEP 418)
    • 1.7、外部函数与内存 API(JEP 419,第二次孵化)
    • 1.8、模式匹配增强(JEP 420,第二次预览)
    • 1.9、废弃 Finalization(JEP 421)
  • 二、Java 19 新特性
    • 2.1、记录模式(预览 JEP 405)
    • 2.2、Linux/RISC-V Port 端口(JEP 422)
    • 2.3、外部函数 & 内存 API(预览 JEP 424)
    • 2.4、虚拟线程(预览 JEP 425)
    • 2.5、Vector API(第四次孵化 JEP 426)
    • 2.6、switch的模式匹配(第三次预览 JEP 427)
    • 2.7、结构化并发(孵化器 JEP 428)
  • 三、Java 20 新特性
    • 3.1、作用域值(Scoped Values,孵化器 JEP 429)
    • 3.2、记录模式(Record Patterns,第二预览 JEP 432)
    • 3.3、switch 模式匹配(第四预览 JEP 433)
    • 3.4、外部函数 & 内存 API(第二预览 JEP 434)
    • 3.5、虚拟线程(第二预览 JEP 436)
    • 3.6、结构化并发(第二孵化器 JEP 437)
    • 3.7、向量 API(第五孵化器 JEP 438)
  • 四、参考

一、Java 18 新特性

官网:https://openjdk.org/projects/jdk/18/

Java 18 在 2022 年 3 月 22 日正式发布,非长期支持版本。

Java 18 带来了 9 个新特性:

  • JEP 400:UTF-8 by Default(默认字符集为 UTF-8)
  • JEP 408:Simple Web Server(简易的 Web 服务器)
  • JEP 413:Code Snippets in Java API Documentation(Java API 文档中的代码片段)
  • JEP 416:Reimplement Core Reflection with Method Handles(使用方法句柄重新实现反射核心)
  • JEP 417:Vector(向量) API(第三次孵化)
  • JEP 418:Internet-Address Resolution(互联网地址解析)SPI
  • JEP 419:Foreign Function & Memory API(外部函数和内存 API)(第二次孵化)
  • JEP 420:Pattern Matching for switch(switch 模式匹配)(第二次预览)
  • JEP 421:Deprecate Finalization for Removal(弃用 Finalization for Removal)

1.1、UTF-8 作为默认字符集(JEP 400)

所有 Java API 默认使用 UTF-8 字符集,避免因系统区域设置不同导致的问题。

import java.nio.charset.Charset;
public class CharsetDemo {public static void main(String[] args) {// 在 Java 18 中始终输出 UTF-8System.out.println("默认字符集: " + Charset.defaultCharset().name());}
}

1.2、简易 Web 服务器(JEP 408)

通过命令行或 API 快速启动一个静态文件服务器。

import com.sun.net.httpserver.SimpleFileServer;
import java.net.InetSocketAddress;
import java.nio.file.Path;
public class WebServerDemo {public static void main(String[] args) throws Exception {// 启动服务器,监听 8080 端口,服务当前目录的文件var server = SimpleFileServer.createFileServer(new InetSocketAddress(8080),Path.of("."),SimpleFileServer.OutputLevel.VERBOSE);server.start();System.out.println("服务器已启动: http://localhost:8080");}
}

1.3、代码片段标签 @snippet(JEP 413)

在 Javadoc 中嵌入高亮代码示例,效果更好且使用起来更方便一些!

/* 计算两数之和:* {@snippet :* int a = 10;* int b = 20;* int sum = a + b;  // 高亮此行* }*/
public class Calculator {public int add(int a, int b) { return a + b; }
}

1.4、使用方法句柄重新实现反射核心(JEP 416)

Java 18 改进了 java.lang.reflect.MethodConstructor 的实现逻辑,使之性能更好,速度更快。这项改动不会改动相关 API ,这意味着开发中不需要改动反射相关代码,就可以体验到性能更好反射。

OpenJDK 官方给出了新老实现的反射性能基准测试结果。

1.5、向量 API(JEP 417,第三次孵化)

向量(Vector) API 最初由 JEP 338 提出,并作为孵化 API集成到 Java 16 中。第二轮孵化由 JEP 414 提出并集成到 Java 17 中,第三轮孵化由 JEP 417 提出并集成到 Java 18 中,第四轮由 JEP 426 提出并集成到了 Java 19 中。

向量计算由对向量的一系列操作组成。向量 API 用来表达向量计算,该计算可以在运行时可靠地编译为支持的 CPU 架构上的最佳向量指令,从而实现优于等效标量计算的性能。

向量 API 的目标是为用户提供简洁易用且与平台无关的表达范围广泛的向量计算。

import jdk.incubator.vector.*;
public class VectorDemo {public static void main(String[] args) {var a = IntVector.fromArray(IntVector.SPECIES_128, new int[]{1, 2, 3, 4}, 0);var b = IntVector.fromArray(IntVector.SPECIES_128, new int[]{5, 6, 7, 8}, 0);var c = a.add(b); // 并行计算四个整数的和System.out.println("结果: " + Arrays.toString(c.toArray())); // [6, 8, 10, 12]}
}

1.6、Internet-Address 解析 SPI(JEP 418)

自定义域名和地址的解析逻辑。

import java.net.spi.InetAddressResolver;
import java.net.spi.InetAddressResolverProvider;
// 实现自定义解析器(需在 META-INF/services 中注册)
public class MyResolverProvider extends InetAddressResolverProvider {@Overridepublic InetAddressResolver get(Configuration configuration) {return new CustomResolver();}// 其他方法省略...
}

1.7、外部函数与内存 API(JEP 419,第二次孵化)

安全地调用本地代码和管理堆外内存。

Java 程序可以通过该 API 与 Java 运行时之外的代码和数据进行互操作。通过高效地调用外部函数(即 JVM 之外的代码)和安全地访问外部内存(即不受 JVM 管理的内存),该 API 使 Java 程序能够调用本机库并处理本机数据,而不会像 JNI 那样危险和脆弱。

外部函数和内存 API 在 Java 17 中进行了第一轮孵化,由 JEP 412 提出。第二轮孵化由JEP 419 提出并集成到了 Java 18 中,预览由 JEP 424 提出并集成到了 Java 19 中。

import jdk.incubator.foreign.*;
public class ForeignMemoryDemo {public static void main(String[] args) {// 分配 100 字节的堆外内存try (MemorySegment segment = MemorySegment.allocateNative(100)) {segment.asByteBuffer().put((byte) 42);System.out.println("写入的值: " + segment.asByteBuffer().get(0));}}
}

1.8、模式匹配增强(JEP 420,第二次预览)

switch 表达式支持更复杂的模式匹配和 null 处理(需启用 --enable-preview)。

public class SwitchDemo {public static void main(String[] args) {Object obj = null;String result = switch (obj) {case Integer i -> "整数: " + i;case String s && s.length() > 5 -> "长字符串: " + s;case String s -> "短字符串: " + s;case null -> "对象为 null";default -> "未知类型";};System.out.println(result); // 输出: 对象为 null}
}

1.9、废弃 Finalization(JEP 421)

标记 Object.finalize() 为过时,推荐使用 <font style="color:rgb(64, 64, 64);">Cleaner</font><font style="color:rgb(64, 64, 64);">try-with-resources</font> 管理资源。

import java.lang.ref.Cleaner;public class ResourceCleanerDemo {private static final Cleaner cleaner = Cleaner.create();private static class Resource implements Runnable {@Overridepublic void run() {System.out.println("资源已清理");}}public static void main(String[] args) {Resource resource = new Resource();cleaner.register(resource, resource); // 注册清理动作}
}

Java 18通过强制UTF-8编码解决了跨平台乱码顽疾,jwebserver成为快速原型开发利器,@snippet标签革新了API文档编写方式,反射性能飞跃赋能主流框架,向量API开启硬件加速计算新时代。建议开发者在数据处理密集型和跨平台项目中优先采用这些特性。


二、Java 19 新特性

官网:https://openjdk.org/projects/jdk/19/

JDK 19 定于 2022 年 9 月 20 日正式发布以供生产使用,非长期支持版本。不过,JDK 19 中有一些比较重要的新特性值得关注。

JDK 19 只有 7 个新特性:

  • JEP 405: Record Patterns(记录模式)(预览)
  • JEP 422: Linux/RISC-V Port 端口
  • JEP 424: Foreign Function & Memory API(外部函数和内存 API)(预览)
  • JEP 425: Virtual Threads(虚拟线程)(预览)
  • JEP 426: Vector(向量)API(第四次孵化)
  • JEP 427: Pattern Matching for switch(switch 模式匹配)
  • JEP 428: Structured Concurrency(结构化并发)(孵化)

2.1、记录模式(预览 JEP 405)

用模式匹配解构 Record 对象。

  • 扩展模式匹配以解构记录类的实例,实现更复杂的数据查询
  • 添加嵌套模式,实现更可组合的数据查询
record Point(int x, int y) {}
// instanceof 模式匹配
if (obj instanceof Point(int x, int y)) {System.out.println(x + ", " + y);
}
// Switch 模式匹配
switch (obj) {case Point(int x, int y) when x == y -> System.out.println("点在对角线上");case Point(int x, int y) -> System.out.println("坐标: " + x + ", " + y);default -> throw new IllegalArgumentException();
}

2.2、Linux/RISC-V Port 端口(JEP 422)

支持 RISC-V 开源指令集架构。

2.3、外部函数 & 内存 API(预览 JEP 424)

安全调用本地代码(如 C 库)。

Java 程序可以通过该 API 与 Java 运行时之外的代码和数据进行互操作。通过高效地调用外部函数(即 JVM 之外的代码)和安全地访问外部内存(即不受 JVM 管理的内存),该 API 使 Java 程序能够调用本机库并处理本机数据,而不会像 JNI 那样危险和脆弱。

外部函数和内存 API 在 Java 17 中进行了第一轮孵化,由 JEP 412 提出。第二轮孵化由JEP 419 提出并集成到了 Java 18 中,预览由 JEP 424 提出并集成到了 Java 19 中。

// 调用 C 的 sqrt 函数
Linker linker = Linker.nativeLinker();
SymbolLookup stdlib = linker.defaultLookup();
MethodHandle sqrt = linker.downcallHandle(stdlib.find("sqrt").get(),FunctionDescriptor.of(ValueLayout.JAVA_DOUBLE, ValueLayout.JAVA_DOUBLE)
);
double result = (double) sqrt.invokeExact(4.0);
System.out.println(result); // 输出 2.0

2.4、虚拟线程(预览 JEP 425)

轻量级线程,提高并发性能。

虚拟线程(Virtual Thread-)是 JDK 而不是 OS 实现的轻量级线程(Lightweight Process,LWP),许多虚拟线程共享同一个操作系统线程,虚拟线程的数量可以远大于操作系统线程的数量。

虚拟线程在其他多线程语言中已经被证实是十分有用的,比如 Go 中的 Goroutine、Erlang 中的进程。

虚拟线程避免了上下文切换的额外耗费,兼顾了多线程的优点,简化了高并发程序的复杂,可以有效减少编写、维护和观察高吞吐量并发应用程序的工作量。

知乎有一个关于 Java 19 虚拟线程的讨论,感兴趣的可以去看看:https://www.zhihu.com/question/536743167

Java 虚拟线程的详细解读和原理可以看下面文章:

  • 虚拟线程原理及性能分析|得物技术
  • Java19 正式 GA!看虚拟线程如何大幅提高系统吞吐量
  • 虚拟线程 - VirtualThread 源码透视
// 创建虚拟线程
Thread.startVirtualThread(() -> {System.out.println("Hello from virtual thread!");
});
// 使用 ExecutorService
try (var executor = Executors.newVirtualThreadPerTaskExecutor()) {executor.submit(() -> downloadFile(url1));executor.submit(() -> processData(url2));
}

2.5、Vector API(第四次孵化 JEP 426)

SIMD 并行计算加速。

IntVector a = IntVector.fromArray(IntVector.SPECIES_128, new int[]{1, 2, 3, 4}, 0);
IntVector b = IntVector.fromArray(IntVector.SPECIES_128, new int[]{5, 6, 7, 8}, 0);
IntVector c = a.add(b); // 并行执行 4 次加法
int[] resultArray = c.toArray(); // [6, 8, 10, 12]

2.6、switch的模式匹配(第三次预览 JEP 427)

扩展switch表达式,支持类型匹配和条件判断:

Object obj = "Hello";String result = switch (obj) {case Integer i -> "Integer: " + i;case String s when s.length() > 5 -> "Long String: " + s;case String s -> "String: " + s;default -> "Unknown";
};

通过case后的类型匹配和when子句的条件过滤,代码逻辑更清晰。

2.7、结构化并发(孵化器 JEP 428)

简化多线程任务管理,将子任务视为一个工作单元。

JDK 19 引入了结构化并发,一种多线程编程方法,目的是为了通过结构化并发 API 来简化多线程编程,并不是为了取代java.util.concurrent,目前处于孵化器阶段。

结构化并发将不同线程中运行的多个任务视为单个工作单元,从而简化错误处理、提高可靠性并增强可观察性。也就是说,结构化并发保留了单线程代码的可读性、可维护性和可观察性。

结构化并发的基本 API 是StructuredTaskScope。StructuredTaskScope 支持将任务拆分为多个并发子任务,在它们自己的线程中执行,并且子任务必须在主任务继续之前完成。

// 需要添加 jdk.incubator.concurrent 模块
try (var scope = new StructuredTaskScope.ShutdownOnFailure()) {Future<String> user = scope.fork(() -> getUserInfo());Future<Integer> order = scope.fork(() -> getLatestOrder());scope.join();          // 等待所有子任务scope.throwIfFailed(); // 异常处理System.out.println(user.resultNow() + ": " + order.resultNow());
}

三、Java 20 新特性

官网:https://openjdk.org/projects/jdk/20/

JDK 20 于 2023 年 3 月 21 日发布,非长期支持版本。

根据开发计划,下一个 LTS 版本就是将于 2023 年 9 月发布的 JDK 21。

JDK 20 只有 7 个新特性:

  • JEP 429:Scoped Values(作用域值)(第一次孵化)
  • JEP 432:Record Patterns(记录模式)(第二次预览)
  • JEP 433:switch 模式匹配(第四次预览)
  • JEP 434: Foreign Function & Memory API(外部函数和内存 API)(第二次预览)
  • JEP 436: Virtual Threads(虚拟线程)(第二次预览)
  • JEP 437:Structured Concurrency(结构化并发)(第二次孵化)
  • JEP 432:向量 API(第五次孵化)

3.1、作用域值(Scoped Values,孵化器 JEP 429)

替代线程局部变量,提供更安全的不可变数据共享。

作用域值(Scoped Values)它可以在线程内和线程间共享不可变的数据,优于线程局部变量,尤其是在使用大量虚拟线程时。

// 需添加 jdk.incubator.concurrent 模块
final static ScopedValue<String> USER = ScopedValue.newInstance();
ScopedValue.where(USER, "Alice").run(() -> {System.out.println(USER.get()); // 输出 Alice
});

3.2、记录模式(Record Patterns,第二预览 JEP 432)

支持嵌套记录解构和更复杂的模式匹配。

记录模式(Record Patterns) 可对 record 的值进行解构,也就是更方便地从记录类(Record Class)中提取数据。并且,还可以嵌套记录模式和类型模式结合使用,以实现强大的、声明性的和可组合的数据导航和处理形式。

注意:不要把记录模式和 JDK16 正式引入的记录类搞混了。

record Point(int x, int y) {}
record Line(Point start, Point end) {}
// 嵌套解构
if (obj instanceof Line(Point(int x1, int y1), Point(int x2, int y2))) {System.out.println("线段端点: (" + x1 + "," + y1 + "), (" + x2 + "," + y2 + ")");
}

3.3、switch 模式匹配(第四预览 JEP 433)

switch 中直接解构对象并匹配条件。

正如 instanceof 一样, switch 也紧跟着增加了类型匹配自动转换功能。

Object obj = new Point(3, 3);
switch (obj) {case Point(int x, int y) when x == y -> System.out.println("点在对角线上");case Point(int x, int y) -> System.out.println("坐标: " + x + ", " + y);default -> throw new IllegalArgumentException();
}

3.4、外部函数 & 内存 API(第二预览 JEP 434)

改进本地代码和内存操作的安全性。

JDK 20 中是第二次预览,由 JEP 434 提出,这次的改进包括:

  • MemorySegmentMemoryAddress 抽象的统一
  • 增强的 MemoryLayout 层次结构
  • MemorySession拆分为ArenaSegmentScope,以促进跨维护边界的段共享。
// 调用 C 的 strlen 函数
Linker linker = Linker.nativeLinker();
SymbolLookup stdlib = linker.defaultLookup();
MethodHandle strlen = linker.downcallHandle(stdlib.find("strlen").get(),FunctionDescriptor.of(ValueLayout.JAVA_LONG, ValueLayout.ADDRESS)
);
try (Arena arena = Arena.openConfined()) {MemorySegment str = arena.allocateUtf8String("Hello");long len = (long) strlen.invokeExact(str);System.out.println(len); // 输出 5
}

3.5、虚拟线程(第二预览 JEP 436)

轻量级线程的 API 优化。

虚拟线程(Virtual Thread)是 JDK 而不是 OS 实现的轻量级线程(Lightweight Process,LWP),由 JVM 调度。许多虚拟线程共享同一个操作系统线程,虚拟线程的数量可以远大于操作系统线程的数量。

在引入虚拟线程之前,java.lang.Thread 包已经支持所谓的平台线程,也就是没有虚拟线程之前,我们一直使用的线程。JVM 调度程序通过平台线程(载体线程)来管理虚拟线程,一个平台线程可以在不同的时间执行不同的虚拟线程(多个虚拟线程挂载在一个平台线程上),当虚拟线程被阻塞或等待时,平台线程可以切换到执行另一个虚拟线程。

try (var executor = Executors.newVirtualThreadPerTaskExecutor()) {executor.submit(() -> {System.out.println("虚拟线程执行任务");});
}

3.6、结构化并发(第二孵化器 JEP 437)

简化多线程错误处理和取消操作。

Java 19 引入了结构化并发,一种多线程编程方法,目的是为了通过结构化并发 API 来简化多线程编程,并不是为了取代java.util.concurrent,目前处于孵化器阶段。

结构化并发将不同线程中运行的多个任务视为单个工作单元,从而简化错误处理、提高可靠性并增强可观察性。也就是说,结构化并发保留了单线程代码的可读性、可维护性和可观察性。

结构化并发的基本 API 是StructuredTaskScope。StructuredTaskScope 支持将任务拆分为多个并发子任务,在它们自己的线程中执行,并且子任务必须在主任务继续之前完成。

try (var scope = new StructuredTaskScope.ShutdownOnFailure()) {Future<String> task1 = scope.fork(() -> "结果1");Future<String> task2 = scope.fork(() -> "结果2");scope.join();System.out.println(task1.resultNow() + " + " + task2.resultNow());
}

3.7、向量 API(第五孵化器 JEP 438)

向量计算由对向量的一系列操作组成。向量 API 用来表达向量计算,该计算可以在运行时可靠地编译为支持的 CPU 架构上的最佳向量指令,从而实现优于等效标量计算的性能。

向量 API 的目标是为用户提供简洁易用且与平台无关的表达范围广泛的向量计算。

向量(Vector) API 最初由 JEP 338 提出,并作为孵化 API集成到 Java 16 中。第二轮孵化由 JEP 414 提出并集成到 Java 17 中,第三轮孵化由 JEP 417 提出并集成到 Java 18 中,第四轮由 JEP 426 提出并集成到了 Java 19 中。

Java20 的这次孵化基本没有改变向量 API ,只是进行了一些错误修复和性能增强,详见 JEP 438。

四、参考

Java 18 新特性概览

相关文章:

Java 18~20 新特性

文章目录 一、Java 18 新特性1.1、UTF-8 作为默认字符集&#xff08;JEP 400&#xff09;1.2、简易 Web 服务器&#xff08;JEP 408&#xff09;1.3、代码片段标签 snippet&#xff08;JEP 413&#xff09;1.4、使用方法句柄重新实现反射核心&#xff08;JEP 416&#xff09;1.…...

程序员学商务英语之At the Hotel

Dialogue-3 Room service-Cleaning the Room客房服务-打扫房间 A: Who will do the dishes after dinner tonight? 今晚饭后谁来洗碗&#xff1f; B: It’s your turn. 轮到你了。 Go do the room right now. clean the room去打扫房间。Doing the laundry is the last thi…...

探秘路由表:网络世界的导航地图

一、引言 在当今数字化时代&#xff0c;网络已经成为我们生活中不可或缺的一部分。无论是浏览网页、观看视频&#xff0c;还是进行在线办公、游戏娱乐&#xff0c;我们都在与网络进行着频繁的交互。而在这背后&#xff0c;网络中的数据传输就如同现实生活中的快递配送&#xf…...

UniApp SelectorQuery 讲解

一、SelectorQuery简介 在UniApp中&#xff0c;SelectorQuery是一个非常强大的工具&#xff0c;它允许开发者查询节点信息。通过这个API&#xff0c;我们可以获取到页面元素的尺寸、位置、滚动条位置等信息。这在处理动态布局、动画效果或是用户交互时尤为重要。 二、基本使用…...

三数之和:经典问题的多种优化策略

三数之和&#xff1a;经典问题的多种优化策略 大家好&#xff0c;我是Echo_Wish。今天我们来聊一个经典的算法问题——三数之和&#xff08;3Sum&#xff09;。它是许多面试和算法竞赛中常见的问题之一&#xff0c;也常常考察我们对算法优化的理解和技巧。我们不仅要解决问题&…...

Flash-00

下载网站&#xff1a;Flash CC 2015中文版下载-Adobe Flash CC 2015(动画制作软件)免费下载-当快软件园 1-什么是Flash&#xff1f; Flash是一款多媒体设计软件&#xff0c;二维交互式动画设计工具&#xff0c;常用于矢量动画制作 2-Flash的应用领域&#xff1f; 动画制作&a…...

FTP 实验(ENSP模拟器实现)

FTP 概述 FTP&#xff08;File Transfer Protocol&#xff0c;文件传输协议&#xff09;是一种用于在网络上进行文件传输的标准协议。它允许用户在两台计算机之间上传和下载文件。 1、FTP采用客户端-服务器模型&#xff0c;客户端通过FTP客户端软件&#xff0c;连接到FTP服务…...

DeepSeek在初创企业、教育和数字营销领域应用思考

如今&#xff0c;像 DeepSeek 这样的人工智能工具正在改变企业的运营方式&#xff0c;优化流程并显著提高生产力。通过重复任务的自动化、大量数据的分析以及内容创建效率的提高&#xff0c;组织正在寻找新的竞争和卓越方式。本文介绍了 DeepSeek 如何用于提高三个关键领域的生…...

ubuntu新系统使用指南

1. 更新源 2. 配置rime 输入法 sudo apt install ibus-rimeibus-setup #打开配置界面添加雾凇拼音 cd ~/Documents/Tool/input_source/plumgit clone --depth 1 https://github.com/rime/plum plum #没有梯子就劝退cd plum/bash rime-install iDvel/rime-ice:others/recipe…...

HaProxy配置详解

一、haproxy基础配置 官方文档&#xff1a;HAProxy version 2.2.22 - Configuration Manual HAProxy 的配置文件haproxy.cfg由两大部分组成&#xff0c;分别是global和proxies部分。 global&#xff1a;全局配置段 进程及安全配置相关的参数性能调整相关参数Debug参数 pro…...

PCL 基于FPFH特征的SAC-IA算法

文章目录 一、简介二、PCL中的相关类型二、实现代码三、实现效果参考资料一、简介 该算法的大致过程如下所示: 通过这种随机采样并使用FPFH描述子进行匹配的方式,可以快速找到一个较好的转换矩阵,从而实现两个物体的初始配准。 二、PCL中的相关类型 类型为:pcl::SampleCons…...

Git操作整体流程

文章目录 1.Git创建个人仓库2、Git全局配置3、Git本地管理4. Git本地管理常用命令汇总5、使用Git命令将项目提交到远程码云管理6.使用IDEA进行管理7、Idea里面的终端8、关于提交总结 1.Git创建个人仓库 打开https://gitee.com/&#xff0c;登录个人账号&#xff0c;右上角加号…...

独立开发者之PLG 和 SLG 是什么

什么是 PLG 和 SLG PLG&#xff08;产品驱动增长&#xff09;是一种策略&#xff0c;通过产品本身吸引用户并推动客户获取、保留和扩展。例如&#xff0c;提供免费试用或免费模式&#xff0c;让用户直接体验产品价值&#xff0c;如 Slack 和 Dropbox 那样。SLG&#xff08;销售…...

Python 基本语法的详细解释

目录 &#xff08;1&#xff09;注释 &#xff08;2&#xff09;缩进 &#xff08;3&#xff09;变量和数据类型 变量定义 数据类型 &#xff08;4&#xff09;输入和输出 输出&#xff1a;print() 函数 输入&#xff1a;input() 函数 &#xff08;1&#xff09;注释 注…...

腾讯SQL面试题变体实现:最长连续天数与允许1天中断的进阶解法

腾讯SQL面试题变体实现:最长连续天数与允许1天中断的进阶解法 作者:某七年数据开发工程师 | 2025年02月23日 关键词:滑动窗口、容错机制、连续区间优化 一、变体题型需求分析 在原题如何找出连续5天涨幅超过5%的股票基础上,需实现两个扩展场景: 最长连续天数:输出每只股…...

KubeKey一键安装部署k8s集群和KubeSphere详细教程

目录 一、KubeKey简介 二、k8s集群KubeSphere安装 集群规划 硬件要求 Kubernetes支持版本 操作系统要求 SSH免密登录 配置集群时钟 所有节点安装依赖 安装docker DNS要求 存储要求 下载 KubeKey 验证KubeKey 配置集群文件 安装集群 验证命令 登录页面 一、Ku…...

w803|联盛德|WM IoT SDK2.X测试|pinout|(2):w803开发板简介

概述 W803-Pico是一款基于联盛德W803芯片为主控的开发板&#xff0c;支持IEEE802.11 b/g/n Wi-Fi&#xff0c;以及BT/BLE4.2协议蓝牙。芯片内置高性能32位处理器&#xff0c;主频高达240MHz。内置2MB Flash以及288KB RAM。硬件采用DIP封装&#xff0c;PCB板载天线&#xff0c;…...

BGP分解实验·19——BGP选路原则之起源

当用不同的方式为BGP注入路由时&#xff0c;起源代码将标识路由的来源。 &#xff08;在BGP表中&#xff0c;Network为“i”&#xff0c;重分布是“&#xff1f;”&#xff09; 实验拓扑如下&#xff1a; R2上将来自IGP的路由10.3.3.3/32用network指令注入BGP;在R4上将来自I…...

使用ESP-IDF来驱动INMP441全向麦克风

之前的文章我们讲过了I2S。 I2S是什么通信协议&#xff1f;它如何传输音频数据&#xff1f;它和I2C是什么关系&#xff1f;_i2c接口和i2s-CSDN博客文章浏览阅读836次&#xff0c;点赞12次&#xff0c;收藏14次。这个可以参考ADC来理解&#xff0c;我们的ADC也是有左对齐和右对…...

C/C++跳动的爱心

系列文章 序号直达链接1C/C李峋同款跳动的爱心2C/C跳动的爱心3C/C经典爱心4C/C满屏飘字5C/C大雪纷飞6C/C炫酷烟花7C/C黑客帝国同款字母雨8C/C樱花树9C/C奥特曼10C/C精美圣诞树11C/C俄罗斯方块小游戏12C/C贪吃蛇小游戏13C/C孤单又灿烂的神14C/C闪烁的爱心15C/C哆啦A梦16C/C简单…...

blender笔记2

一、物体贴地 物体->变换->对齐物体 ->对齐弹窗(对齐模式&#xff1a;反方&#xff0c;相对于&#xff1a;场景原点&#xff0c;对齐&#xff1a;z)。 之后可以设置原点->原点--3d游标 二、面上有阴影 在编辑模式下操作过后&#xff0c;物体面有阴影。 数据-&g…...

关于在mac中配置Java系统环境变量

引言 在 macOS 上开发 Java 或 Flutter 应用时&#xff0c;正确配置环境变量是至关重要的。环境变量不仅能让系统找到开发工具的位置&#xff0c;还能简化命令行操作。本文将手把手教你从零开始安装 Java SDK&#xff0c;并详细配置环境变量&#xff0c;涵盖常见问题解决和优化…...

透彻理解:方差、协方差、相关系数、协方差矩阵及其应用

最近看了几篇跨领域特征对齐方面的经典文献&#xff0c;学者们搞了很多花样&#xff0c;如有的提出一阶统计特征对齐&#xff0c;有的提出二阶统计特征对齐&#xff0c;有的学者提出高阶统计特征对齐。 通俗而言&#xff0c;就是在统计特征层面对跨域特征进行对齐&#xff0c;…...

【SPIE出版,见刊快速,EI检索稳定,浙江水利水电学院主办】2025年物理学与量子计算国际学术会议(ICPQC 2025)

2025年物理学与量子计算国际学术会议&#xff08;ICPQC 2025&#xff09;将于2025年4月18-20日在中国杭州举行。本次会议旨在汇聚全球的研究人员、学者和业界专家&#xff0c;共同探讨物理学与量子计算领域的最新进展与前沿挑战。随着量子技术的快速发展&#xff0c;其在信息处…...

jmeter后端监视器的妙用和实现方法

JMeter 的后端监视器&#xff08;Backend Listener&#xff09;是一个强大的工具&#xff0c;可用于收集、存储和分析测试过程中的性能指标。它允许将测试数据发送到外部系统&#xff08;如 InfluxDB、Graphite 等&#xff09;&#xff0c;并借助这些系统的可视化工具&#xff…...

Docker 的安全配置与优化(二)

Docker 安全优化策略 &#xff08;一&#xff09;多阶段构建优化镜像大小 多阶段构建是 Docker 17.05 版本引入的强大功能&#xff0c;它允许在一个 Dockerfile 中定义多个构建阶段&#xff0c;每个阶段都可以使用不同的基础镜像和依赖项&#xff0c;最终只将必要的文件和依赖…...

宝塔扩容——阿里云如何操作

一、创建快照 磁盘快照&#xff0c;将数据备份&#xff0c;防止丢失。 1.登录“阿里云”账号 2.点击“控制台”——“云服务器 ECS” 3.点击“基本信息”下&#xff0c;右下角“系统盘” 4.点击“创建快照” 二、磁盘扩容 1.点击“云盘扩容” 2. 选择自己要扩容的大小 …...

vscode settings(一):全局| 用户设置常用的设置项

参考资料 Visual Studio Code权威指南 by 韩骏 一. 全局设置与用户设置 1.1 Vscode支持两种不同范围的设置 用户设置(User Settings)&#xff1a;这是一个全局范围的设置&#xff0c;会应用到所有的Visual Studio Code实例中。工作区设置(Workspace Settings)&#xff1a;设…...

DeepSeek R1本地+私有云版医疗AI部署开发成功案例技术剖析

1. 引言 1.1 研究背景与意义 随着科技的飞速发展,人工智能(AI)在医疗领域的应用正逐渐成为推动医疗行业变革的重要力量。近年来,医疗 AI 取得了显著的进展,从疾病诊断、药物研发到医疗管理等各个环节,AI 技术都展现出了巨大的潜力。它能够处理和分析海量的医疗数据,为…...

CMOS图像传感器——偏振光图像传感器技术

最近,在索尼官网看到了其提到的偏光图像传感器技术Polarsens,感到好奇,查阅了相关资料,总结如下。。。。 一、偏振光 偏振实际上是光的一种基本属性,表述光电场振动的方向。振动方向和光波前进的方向构成的平面叫振动面。大多数的光源,比如太阳,发出非偏振光,这里我们…...

ROS2 中 TF 变换发布与订阅:实现 base_link 和 test_link 实时可视化显示

视频讲解 ROS2 中 TF 变换发布与订阅&#xff1a;实现 base 安装环境依赖 sudo apt-get install ros-humble-tf2-ros ros-humble-tf2-geometry-msgs ros-humble-tf-transformations 创建一个包名为tf_test_pkg的包 ros2 pkg create --build-type ament_python tf_test_pkg -…...

SQLMesh 系列教程9- 宏变量及内置宏变量

SQLMesh 的宏变量是一个强大的工具&#xff0c;能够显著提高 SQL 模型的动态化能力和可维护性。通过合理使用宏变量&#xff0c;可以实现动态时间范围、多环境配置、参数化查询等功能&#xff0c;从而简化数据模型的开发和维护流程。随着数据团队的规模扩大和业务复杂度的增加&…...

逻辑函数的神经网络实现

1.单层感知器实现基本逻辑函数 先给大家抛出一道例题 &#xff08;一&#xff09;种类 a.OR函数 目标&#xff1a;当至少一个输入为1时&#xff0c;输出1&#xff1b;否则输出0。 权重设置&#xff1a; 输入权重&#xff1a;所有 wi1&#xff08;i1,2,...,m&#xff09;。…...

链表-基础训练(二)链表 day14

两两交换链表中的节点 题目示意&#xff1a; 给定一个链表&#xff0c;两两交换其中相邻的节点&#xff0c;并返回交换后的链表。 你不能只是单纯的改变节点内部的值&#xff0c;而是需要实际的进行节点交换。 原先我的思路是图像上的思路&#xff0c;但是我感觉还是很复杂…...

使用大语言模型对接OA系统,实现会议室预定功能

随着人工智能技术的不断进步&#xff0c;越来越多的企业开始借助 AI 助手来提高工作效率&#xff0c;尤其是在日常事务的自动化处理中。比如&#xff0c;在许多公司里&#xff0c;会议室的预定是一个常见且频繁的需求&#xff0c;通常需要员工手动检查空闲时间并做出选择。而通…...

hugging face---transformers包

一、前言 不同于计算机视觉的百花齐放&#xff0c;不同网络适用不同情况&#xff0c;NLP则由Transformer一统天下。transformer是2017年提出的一种基于自注意力机制的神经网络架构&#xff0c;transformers库是hugging face社区创造的一个py库&#xff0c;通过该库可以实现统一…...

1. 自定义组件基础

相关资源&#xff1a; &#x1f4ce;day10 图片素材.zip 1. 自定义组件基础 概念&#xff1a;在ArkUI中由框架直接提供的称为系统组件 -> Column&#xff0c;Button等&#xff0c;由开发者定义的称为自定义组件 作用&#xff1a;自定义组件可以对 UI和业务逻辑进行封装&…...

连接Sql Server时报错无法通过使用安全套接字层加密与 SQL Server 建立安全连接

文章目录 一. 前言二. 解决方案 方案1方案2 三. 总结 一. 前言 在《数据库原理》这门课的实验上&#xff0c;需要使用SQL Server&#xff0c;然后使用jdbc连接sql server突然报错为&#xff1a;SQLServerException: “Encrypt”属性设置为“true”且 “trustServerCertific…...

python使用httpx_sse调用sse流式接口对响应格式为application/json的错误信息的处理

目录 问题描述方案 问题描述 调用sse流式接口使用httpx_sse的方式 import httpxfrom httpx_sse import connect_sse# 省略无关代码try:with httpx.Client() as client:with connect_sse(client, "GET", url, paramsparam) as event_source:clear_textbox(response_t…...

R 语言科研绘图 --- 散点图-汇总

在发表科研论文的过程中&#xff0c;科研绘图是必不可少的&#xff0c;一张好看的图形会是文章很大的加分项。 为了便于使用&#xff0c;本系列文章介绍的所有绘图都已收录到了 sciRplot 项目中&#xff0c;获取方式&#xff1a; R 语言科研绘图模板 --- sciRplothttps://mp.…...

【语音科学计算器】当前汇率

JSON_MARKER_HORN{“base”:“USD”,“rates”:{“EUR”:0.9758,“JPY”:157.68,“GBP”:0.8190,“CNY”:7.3327,“HKD”:7.7872,“AUD”:1.6260,“CAD”:1.4422,“CHF”:0.9157,“SGD”:1.3714,“KRW”:1473.05,“NZD”:1.7992,“THB”:34.54,“MYR”:4.4930,“PHP”:57.32,“…...

python 进程池的基本使用

Python 进程池&#xff1a;Pool任务调度实现 在现代计算机系统重&#xff0c;处理器核心数量的增加为并行计算提供了强大的硬件基础。Python的 multiprocessing 模块中的进程池&#xff08;Pool&#xff09;机制&#xff0c;为开发者提供了 一个高效且易用的并行处理框架。 通…...

初识XML

初识XML <?xml version"1.0" encoding"utf-8" ?> <!--根标签只能有一个--> <!--第一行永远都是 <?xml version"1.0" encoding"utf-8" ?> 前面不允许出现任何其他东西&#xff0c;空格换行等均不行 --> &…...

VisActor/VTable - 快速搭建表格

VTable源于VisActor体系&#xff0c;该体系是从字节跳动大量可视化场景沉淀而来&#xff0c;旨在提供面向叙事的智能可视化解决方案。VisActor包括渲染引擎、可视化语法、数据分析组件、图表组件、表格组件、GIS组件、图可视化组件、智能组件等多个模块&#xff0c;以及周边生态…...

网络安全营运周报

&#x1f345; 点击文末小卡片 &#xff0c;免费获取网络安全全套资料&#xff0c;资料在手&#xff0c;涨薪更快 第三章网络安全基础 一、网络安全概述 1、网络安全现状及安全挑战 网络安全范畴极其广泛&#xff0c;可以说是涉及多方面。 因为计算机病毒层出不穷以及黑客的…...

网络运维学习笔记 017 HCIA-Datacom综合实验01

文章目录 综合实验1实验需求总部特性 分支8分支9 配置一、 基本配置&#xff08;IP二层VLAN链路聚合&#xff09;ACC_SWSW-S1SW-S2SW-Ser1SW-CoreSW8SW9DHCPISPGW 二、 单臂路由GW 三、 vlanifSW8SW9 四、 OSPFSW8SW9GW 五、 DHCPDHCPGW 六、 NAT缺省路由GW 七、 HTTPGW 综合实…...

【Viewer.js】vue3封装图片查看器

效果图 需求 点击图片放大可关闭放大的 图片 下载 cnpm in viewerjs状态管理方法 stores/imgSeeStore.js import { defineStore } from pinia export const imgSeeStore defineStore(imgSeeStore, {state: () > ({showImgSee: false,ImgUrl: ,}),getters: {},actions: {…...

hot100_108. 将有序数组转换为二叉搜索树

hot100_108. 将有序数组转换为二叉搜索树 思路 给你一个整数数组 nums &#xff0c;其中元素已经按 升序 排列&#xff0c;请你将其转换为一棵 平衡 二叉搜索树。 示例 1&#xff1a; 输入&#xff1a;nums [-10,-3,0,5,9] 输出&#xff1a;[0,-3,9,-10,null,5] 解释&#…...

给小米/红米手机root(工具基本为官方工具)——KernelSU篇

目录 前言准备工作下载刷机包xiaomirom下载刷机包【适用于MIUI和hyperOS】“hyper更新”微信小程序【只适用于hyperOS】 下载KernelSU刷机所需程序和驱动文件 开始刷机设置手机第一种刷机方式【KMI】推荐提取boot或init_boot分区 第二种刷机方式【GKI】不推荐 结语 前言 刷机需…...

(四)趣学设计模式 之 原型模式!

目录 一、 啥是原型模式&#xff1f;二、 为什么要用原型模式&#xff1f;三、 原型模式怎么实现&#xff1f;四、 原型模式的应用场景五、 原型模式的优点和缺点六、 总结 &#x1f31f;我的其他文章也讲解的比较有趣&#x1f601;&#xff0c;如果喜欢博主的讲解方式&#xf…...