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

文章目录

  • Java 15 新特性解析与代码示例
    • 引言
    • 1. 密封类(Sealed Classes)
      • 1.1. 什么是密封类?
      • 1.2. 为什么使用密封类?
      • 1.3. 语法
      • 1.4. 与传统方法的对比
      • 1.5. 使用场景
      • 1.6. 示例:结合模式匹配
    • 2. `instanceof` 模式匹配(Pattern Matching for instanceof)
      • 2.1. 什么是模式匹配?
      • 2.2. 语法
      • 2.3. 优点
      • 2.4. 与密封类的结合
      • 2.5. 示例
    • 3. 记录(Records)
      • 3.1. 什么是记录?
      • 3.2. 语法
      • 3.3. 优点
      • 3.4. 使用场景
      • 3.5. 示例
    • 4. 文本块(Text Blocks)
      • 4.1. 什么是文本块?
      • 4.2. 语法
      • 4.3. 优点
      • 4.4. 缩进处理
      • 4.5. 示例
    • 5. 隐藏类(Hidden Classes)
      • 5.1. 什么是隐藏类?
      • 5.2. 为什么重要?
      • 5.3. 示例
    • 6. 外部内存访问API(Foreign-Memory Access API)
      • 6.1. 什么是外部内存访问API?
      • 6.2. 用途
      • 6.3. 示例
    • 7. 垃圾回收器:ZGC和Shenandoah
      • 7.1. ZGC
      • 7.2. Shenandoah
      • 7.3. 选择建议
    • 8. Unicode 13.0支持
    • 9. CharSequence的`isEmpty`方法
    • 10. EdDSA加密支持
      • 10.1. 什么是EdDSA?
      • 10.2. 示例
    • 11. 其他特性
    • 12. 结语

引言

Java 15(JDK 15)于2020年9月15日发布,作为Java快速发布周期(每六个月一次)的一部分,带来了多项新特性和改进。这些特性涵盖语言增强、API改进和JVM优化,旨在提升开发者的生产力、代码可读性和程序性能。本文将深入探讨Java 15的关键特性,包括密封类、模式匹配、记录、文本块等,并为每个特性提供详细的代码示例和与传统方法的对比。我们还将介绍其他重要更新,如隐藏类、外部内存访问API、垃圾回收器改进等。

本文的目标是为开发者提供"硬核"且实用的内容,确保读者在阅读后能够理解每个特性的用途并能将其应用于实际项目中。需要注意的是:

  1. 密封类、模式匹配和记录是预览特性,需使用--enable-preview标志启用
  2. 外部内存访问API是孵化特性,需使用--add-modules jdk.incubator.foreign启用
  3. 部分特性在不同Java版本中的状态不同,使用时需注意版本兼容性

在这里插入图片描述

以下是Java 15的主要新特性列表:

  1. 密封类(Sealed Classes,JEP 360,预览特性)
  2. instanceof模式匹配(Pattern Matching for instanceof,JEP 375,预览特性)
  3. 记录(Records,JEP 384,预览特性)
  4. 文本块(Text Blocks,JEP 378,正式特性)
  5. 隐藏类(Hidden Classes,JEP 371)
  6. 外部内存访问API(Foreign-Memory Access API,JEP 383,孵化特性)
  7. ZGC和Shenandoah垃圾回收器(JEP 377和JEP 379,生产就绪)
  8. Unicode 13.0支持
  9. CharSequence的isEmpty方法
  10. EdDSA加密支持(JEP 339)

让我们逐一深入分析这些特性。

1. 密封类(Sealed Classes)

1.1. 什么是密封类?

密封类是Java 15引入的预览特性(JEP 360),允许开发者限制哪些类可以扩展某个类或实现某个接口。通过使用sealed关键字和permits子句,开发者可以明确指定允许的子类,从而控制继承层次。这种机制特别适合需要严格定义类层次结构的场景,例如在领域建模中限制可能的子类型。

1.2. 为什么使用密封类?

密封类提供了以下优势:

  • 控制继承:防止意外的子类扩展,确保只有指定的类可以继承。
  • 穷尽性模式匹配:与模式匹配结合使用时,编译器可以验证是否处理了所有可能的子类。
  • 代码清晰性:明确类层次结构,减少维护复杂性。
  • 性能优化:JVM可以利用密封类的有限子类信息进行优化。

1.3. 语法

密封类的定义使用sealed关键字,并在permits子句中列出允许的子类。子类必须是finalsealednon-sealed之一。

non-sealed允许子类被自由扩展,提供了密封类层次结构中的灵活性。

示例:

public sealed class Shape permits Circle, Rectangle, Triangle {public abstract void draw();
}public final class Circle extends Shape {@Overridepublic void draw() {System.out.println("Drawing a circle");}
}public final class Rectangle extends Shape {@Overridepublic void draw() {System.out.println("Drawing a rectangle");}
}public non-sealed class Triangle extends Shape {@Overridepublic void draw() {System.out.println("Drawing a triangle");}
}// Triangle是非密封的,可以自由扩展
class RightTriangle extends Triangle {@Overridepublic void draw() {System.out.println("Drawing a right triangle");}
}

在这个例子中,Shape是一个密封类,只允许CircleRectangleTriangle扩展它。Triangle被声明为non-sealed,因此可以进一步被RightTriangle扩展。

1.4. 与传统方法的对比

在Java 15之前,控制继承通常有以下方法:

  • 使用final:完全禁止扩展,但无法允许任何子类。
  • 使用包访问控制:通过将类放在同一包中并限制访问权限来控制继承,但这种方法不够灵活。
  • 使用接口和实现类:但无法限制哪些类可以实现接口。

密封类通过sealedpermitsfinalnon-sealed的组合,提供了更灵活和明确的继承控制机制。

1.5. 使用场景

密封类在以下场景中特别有用:

  • 领域建模:例如,在金融系统中定义一组固定的交易类型。
  • API设计:限制哪些类可以实现某个接口,确保API的正确使用。
  • 模式匹配:与instanceof模式匹配结合,实现穷尽性检查。

1.6. 示例:结合模式匹配

密封类与模式匹配结合可以实现更安全的类型处理。以下是一个完整示例:

public sealed class Shape permits Circle, Rectangle {public abstract double area();
}public final class Circle extends Shape {private final double radius;public Circle(double radius) {this.radius = radius;}@Overridepublic double area() {return Math.PI * radius * radius;}
}public final class Rectangle extends Shape {private final double width, height;public Rectangle(double width, double height) {this.width = width;this.height = height;}@Overridepublic double area() {return width * height;}
}public class ShapeCalculator {public static void printArea(Shape shape) {// 编译器知道Shape只有Circle和Rectangle两种子类if (shape instanceof Circle c) {System.out.println("Circle area: " + c.area());} else if (shape instanceof Rectangle r) {System.out.println("Rectangle area: " + r.area());}// 不需要else分支,因为所有可能性都已处理}public static void main(String[] args) {Shape circle = new Circle(5.0);Shape rectangle = new Rectangle(4.0, 6.0);printArea(circle);     // 输出:Circle area: 78.53981633974483printArea(rectangle);  // 输出:Rectangle area: 24.0}
}

注意:由于密封类是预览特性,编译和运行时需使用--enable-preview标志:

javac --enable-preview --release 15 ShapeCalculator.java
java --enable-preview ShapeCalculator

2. instanceof 模式匹配(Pattern Matching for instanceof)

2.1. 什么是模式匹配?

instanceof模式匹配是Java 15的预览特性(JEP 375),允许在类型检查的同时声明一个变量,直接使用该变量而无需显式类型转换。这减少了样板代码,提高了代码的可读性和安全性。

2.2. 语法

传统方式:

if (obj instanceof String) {String str = (String) obj;  // 需要显式转换System.out.println(str.toUpperCase());
}

使用模式匹配:

if (obj instanceof String str) {  // 自动转换并赋值给strSystem.out.println(str.toUpperCase());// str的作用域仅限于这个if块内
}

在模式匹配中,str是一个绑定变量,如果objString类型,则自动转换为String并赋值给str。注意变量的作用域仅限于对应的if块内。

2.3. 优点

  • 简洁性:将类型检查和转换合并为一行。
  • 可读性:代码更直观,逻辑更清晰。
  • 安全性:避免了手动类型转换可能导致的ClassCastException

2.4. 与密封类的结合

模式匹配与密封类结合时,编译器可以确保所有可能的子类都被处理。例如:

public void handleShape(Shape shape) {if (shape instanceof Circle c) {c.draw();} else if (shape instanceof Rectangle r) {r.draw();}// 不需要else分支,编译器知道Shape只有这两种子类
}

2.5. 示例

以下是一个结合密封类和模式匹配的完整示例:

public class PatternMatchingExample {public static void process(Object obj) {if (obj instanceof String s) {System.out.println("String length: " + s.length());} else if (obj instanceof Integer i && i > 0) {System.out.println("Positive integer: " + i);} else if (obj instanceof Double d) {System.out.println("Double value: " + d);} else {System.out.println("Unknown type: " + obj.getClass());}}public static void main(String[] args) {process("Hello");    // 输出:String length: 5process(42);         // 输出:Positive integer: 42process(3.14);       // 输出:Double value: 3.14process(new Object());// 输出:Unknown type: class java.lang.Object}
}

注意:模式匹配是预览特性,需启用--enable-preview

3. 记录(Records)

3.1. 什么是记录?

记录(Records)是Java 14引入并在Java 15继续作为预览特性的功能(JEP 384)。记录是一种特殊的类,专为携带不可变数据设计,自动生成构造函数、访问器、toStringequalshashCode方法。

记录有以下限制:

  • 隐含final,不能是abstract
  • 不能显式扩展其他类(隐含扩展Record类)
  • 所有字段都是final的
  • 不能声明实例字段(只能在记录头中声明)

3.2. 语法

记录的定义非常简洁:

public record Point(int x, int y) {}

这等同于以下传统类:

public final class Point {private final int x;private final int y;public Point(int x, int y) {this.x = x;this.y = y;}public int x() { return x; }public int y() { return y; }@Overridepublic String toString() {return "Point[x=" + x + ", y=" + y + "]";}@Overridepublic boolean equals(Object o) {if (this == o) return true;if (o == null || getClass() != o.getClass()) return false;Point point = (Point) o;return x == point.x && y == point.y;}@Overridepublic int hashCode() {return Objects.hash(x, y);}
}

3.3. 优点

  • 简洁性:减少了大量样板代码。
  • 不可变性:记录默认不可变,适合线程安全和功能式编程。
  • 一致性:自动生成的方法遵循标准约定。

3.4. 使用场景

记录适用于:

  • 数据传输对象(DTO):在层与层之间传递数据。
  • 元组:临时组合多个值。
  • 功能式编程:与Stream API等结合使用。

3.5. 示例

以下是一个使用记录计算两点距离的示例:

public record Point(int x, int y) {// 可以在记录中添加自定义方法public double distanceTo(Point other) {int dx = x - other.x();int dy = y - other.y();return Math.sqrt(dx * dx + dy * dy);}
}public class PointDistance {public static void main(String[] args) {Point p1 = new Point(0, 0);Point p2 = new Point(3, 4);// 使用自动生成的toString()System.out.println("Point 1: " + p1);  // 输出:Point 1: Point[x=0, y=0]// 使用自定义方法double dist = p1.distanceTo(p2);System.out.println("Distance: " + dist);  // 输出:Distance: 5.0// 使用自动生成的equals()System.out.println("Equal points: " + p1.equals(new Point(0, 0)));  // 输出:true}
}

注意:记录是预览特性,需启用--enable-preview

4. 文本块(Text Blocks)

4.1. 什么是文本块?

文本块(Text Blocks)是Java 13引入预览、Java 14二次预览并在Java 15成为正式特性的功能(JEP 378)。它允许开发者以自然的方式定义多行字符串,无需使用转义字符或字符串拼接。

4.2. 语法

文本块使用三重引号(""")定义:

String html = """<html><body><p>Hello, world</p></body></html>""";

文本块中的空白行会被保留。如果一行只包含缩进空格,它会被视为空白行而不是空字符串。

4.3. 优点

  • 可读性:多行字符串更直观。
  • 减少转义:无需手动转义引号或换行符。
  • 缩进控制:支持自然的代码缩进。

4.4. 缩进处理

文本块默认保留代码中的缩进。如果需要去除前导空格,可以使用String.stripIndent()方法:

String html = """<html><body><p>Hello</p></body></html>""".stripIndent();

4.5. 示例

以下是一个使用文本块定义JSON的示例:

String json = """{"name": "John","age": 30,"city": "New York","hobbies": ["reading","traveling"]}""";System.out.println(json);

SQL查询示例:

String query = """SELECT u.id, u.name, COUNT(o.id) AS order_countFROM users uLEFT JOIN orders o ON u.id = o.user_idWHERE u.active = trueGROUP BY u.id, u.nameHAVING COUNT(o.id) > 0ORDER BY order_count DESC""";

5. 隐藏类(Hidden Classes)

5.1. 什么是隐藏类?

隐藏类(Hidden Classes,JEP 371)是Java 15引入的特性,允许JVM在运行时创建不可见的类。这些类不注册在常量池中,无法通过反射访问,主要用于优化JVM内部实现,如lambda表达式和方法句柄。

5.2. 为什么重要?

隐藏类提高了性能和内存效率:

  • 减少内存占用:避免创建命名类的开销。
  • 提高封装性:隐藏实现细节,防止外部访问。
  • 优化堆栈跟踪:使lambda表达式的堆栈跟踪更清晰。

开发者也可以通过MethodHandles.Lookup.defineHiddenClass方法显式创建隐藏类,但这通常只在需要高度动态类加载的高级场景中使用。

5.3. 示例

隐藏类通常由JVM内部使用,例如:

List<String> list = Arrays.asList("a", "b", "c");
list.forEach(s -> System.out.println(s));  // lambda由隐藏类实现

6. 外部内存访问API(Foreign-Memory Access API)

6.1. 什么是外部内存访问API?

外部内存访问API(JEP 383)是Java 15的孵化特性,允许Java程序安全高效地访问堆外内存(如本地内存)。它是Project Panama的一部分,旨在改善Java与本地代码的互操作性。

6.2. 用途

  • 高性能数据处理:直接操作大块数据,避免复制到Java堆。
  • 本地库交互:与C/C++库共享内存。
  • 内存映射文件:直接访问文件内容。

6.3. 示例

以下是一个安全使用外部内存访问API的示例:

import jdk.incubator.foreign.MemorySegment;
import jdk.incubator.foreign.ResourceScope;public class ForeignMemoryExample {public static void main(String[] args) {try {try (ResourceScope scope = ResourceScope.newConfinedScope()) {MemorySegment segment = MemorySegment.allocateNative(10, scope);// 写入数据for (int i = 0; i < 10; i++) {segment.setAtIndex(byte.class, i, (byte)(65 + i));}// 读取数据for (int i = 0; i < 10; i++) {System.out.print((char) segment.getAtIndex(byte.class, i));}// 输出:ABCDEFGHIJ}} catch (Exception e) {e.printStackTrace();}}
}

注意:此特性需要启用孵化模块:

javac --add-modules jdk.incubator.foreign ForeignMemoryExample.java
java --add-modules jdk.incubator.foreign ForeignMemoryExample

7. 垃圾回收器:ZGC和Shenandoah

7.1. ZGC

ZGC(Z Garbage Collector,JEP 377)是低延迟、高可扩展性的垃圾回收器,适合大堆内存和低暂停时间需求的应用。在Java 15中,ZGC正式成为生产就绪特性。

启用方式:

java -XX:+UseZGC YourApp

7.2. Shenandoah

Shenandoah(JEP 379)是另一个低延迟垃圾回收器,强调并发标记和压缩。在Java 15中也成为生产就绪特性。

启用方式:

java -XX:+UseShenandoahGC YourApp

7.3. 选择建议

垃圾回收器最大堆大小平均暂停时间适用场景
ZGC16TB<10ms超大堆、极低延迟
Shenandoah数TB<10ms大堆、平衡吞吐量
G1数十GB<200ms大多数通用应用

8. Unicode 13.0支持

Java 15支持Unicode 13.0,新增5930个字符(总计143859个),4个新脚本(总计154个)和55个新emoji字符。这对国际化应用至关重要,确保Java能处理最新的字符和脚本。

9. CharSequence的isEmpty方法

Java 15为CharSequence接口添加了默认方法isEmpty(),用于检查字符序列是否为空。

示例:

CharSequence seq = "";
if (seq.isEmpty()) {  // 比seq.length() == 0更直观System.out.println("Sequence is empty");
}

10. EdDSA加密支持

10.1. 什么是EdDSA?

EdDSA(Edwards-curve Digital Signature Algorithm,JEP 339)是Java 15引入的现代数字签名算法,基于椭圆曲线加密,提供高性能和高安全性。

EdDSA相比传统ECDSA有以下优势:

  • 更高的性能
  • 更强的安全性
  • 更简单的密钥生成
  • 天然抵抗侧信道攻击

10.2. 示例

以下是使用EdDSA签名和验证的示例:

import java.security.*;
import java.util.Base64;public class EdDSAExample {public static void main(String[] args) throws Exception {// 生成密钥对KeyPairGenerator kpg = KeyPairGenerator.getInstance("Ed25519");KeyPair kp = kpg.generateKeyPair();// 签名Signature sig = Signature.getInstance("Ed25519");sig.initSign(kp.getPrivate());byte[] message = "Important message".getBytes();sig.update(message);byte[] signature = sig.sign();System.out.println("Signature: " + Base64.getEncoder().encodeToString(signature));// 验证sig.initVerify(kp.getPublic());sig.update(message);boolean verified = sig.verify(signature);System.out.println("Verified: " + verified);  // 输出:true}
}

11. 其他特性

  • Nashorn JavaScript引擎移除(JEP 372):Nashorn引擎被移除,建议使用GraalVM等替代方案。
  • RMI激活机制弃用(JEP 385):RMI激活机制被标记为即将移除。
  • DatagramSocket API重实现(JEP 373):优化了旧的DatagramSocket实现,提高性能。

12. 结语

Java 15通过引入密封类、模式匹配、记录和文本块等特性,显著提升了语言的表达力和开发效率。隐藏类和外部内存访问API优化了JVM性能,而ZGC和Shenandoah的成熟为低延迟应用提供了更多选择。Unicode 13.0和EdDSA支持进一步增强了Java的国际化能力和安全性。

开发者应尝试这些新特性,尤其是在测试环境中探索预览和孵化特性。使用预览特性时,记得启用--enable-preview标志;使用孵化特性时,需启用相应模块。未来版本可能会对这些特性进行调整或正式化,因此保持关注是明智的选择。

参考资料

  • JDK 15 Release Notes
  • Java 15 Features on javaalmanac.io
  • OpenJDK JEP Index
  • Java Language Updates

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

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

相关文章

Vue 3 入门教程 - 1、基础概念与环境搭建

一、Vue 3 简介 Vue.js 是一款流行的 JavaScript 前端框架&#xff0c;用于构建用户界面。Vue 3 作为其最新版本&#xff0c;带来了诸多令人瞩目的新特性与性能优化&#xff0c;为开发者打造了更为高效、灵活的开发体验。 1.1 Vue 3 的优势 性能提升&#xff1a;对虚拟 DOM …

SpringBoot之多环境配置全解析

SpringBoot之多环境配置全解析一、多环境配置的核心思路二、3种配置文件格式详解2.1 properties格式&#xff08;传统格式&#xff09;1. 基础配置文件&#xff08;application.properties&#xff09;2. 环境专属配置文件2.2 yaml/yml格式&#xff08;推荐&#xff09;1. 单文…

uvm-tlm-nonblocking-get-port

前文展示了使用本质为阻塞性质的uvm_blocking_get_port TLM端口的示例&#xff0c;其中接收方会停滞等待发送方完成get任务。类似地&#xff0c;UVM TLM还提供非阻塞类型的uvm_nonblocking_get_port&#xff0c;发送方需通过try_get来检测get是否成功&#xff0c;或通过can_get…

【NCS随笔】如何在hello_world添加蓝牙功能(一)

如何在hello_world添加蓝牙功能&#xff08;一&#xff09;环境准备 硬件&#xff1a;nRF54L15DK 软件版本&#xff1a;NCS3.0.2 例程&#xff1a;hello_world 宏的配置 # Config loggerCONFIG_LOGyCONFIG_USE_SEGGER_RTTyCONFIG_LOG_BACKEND_RTTyCONFIG_LOG_BACKEND_UARTnONFI…

机器学习——KNN实现手写数字识别:基于 OpenCV 和 scikit-learn 的实战教学 (超级超级超级简单)

用KNN实现手写数字识别&#xff1a;基于 OpenCV 和 scikit-learn 的实战教学在这篇文章中&#xff0c;我们将使用 KNN&#xff08;K-Nearest Neighbors&#xff09;算法对手写数字进行分类识别。我们会用 OpenCV 读取图像并预处理数据&#xff0c;用 scikit-learn 构建并训练模…

【Git】分支

文章目录理解分支创建分支切换分支合并分支删除分支合并冲突分支管理策略分支策略bug 分支删除临时分支小结理解分支 本章开始介绍 Git 的杀手级功能之一&#xff08;注意是之一&#xff0c;也就是后面还有之二&#xff0c;之三……&#xff09;&#xff1a;分支。分支就是科幻…

【32】C# WinForm入门到精通 ——打开文件OpenFileDialog 【属性、方法、事件、实例、源码】

WinForm 是 Windows Form 的简称&#xff0c;是基于 .NET Framework 平台的客户端&#xff08;PC软件&#xff09;开发技术&#xff0c;是 C# 语言中的一个重要应用。 .NET 提供了大量 Windows 风格的控件和事件&#xff0c;可以直接拿来使用。 本专栏内容是按照标题序号逐渐…

Wan2.2开源第1天:动态灯光功能开启创意氛围新境界

在开源软件蓬勃发展的今天&#xff0c;每一次新版本的发布都如同在创意的星空中点亮了一颗璀璨的新星。今天&#xff0c;&#xff08;通义万相国际版wan&#xff09;Wan2.2正式开源&#xff0c;它带着令人眼前一亮的动态灯光功能惊艳登场&#xff0c;为所有追求创意与氛围营造的…

Excel制作滑珠图、哑铃图

Excel制作滑珠图、哑铃图效果展示在较长时间周期内&#xff0c;很多参数都是在一定范围内浮动的&#xff0c;并不是一成不变的&#xff0c;为了直观表达各类别的浮动范围&#xff0c;使用“滑珠图”就是一个不错的选择&#xff0c;当滑珠图两侧均有珠子的时候&#xff0c;又称为…

Day07 JDBC+MyBatis

1.JDBC入门程序2.JDBC执行DQL语句3.JDBC预编译SQL 防止SQL注入随便输入用户名&#xff0c;密码为or1 1,sql注入4.Mybatis入门 Mapper 持久层XxxMapper替代Dao4.1调用接口的findAll()方法时自动执行上方的SQL语句&#xff0c;并将SQL查询的语句自动封装到返回值中5.Mybatis辅助…

OSS-服务端签名Web端直传+STS获取临时凭证+POST签名v4版本开发过程中的细节

这里写自定义目录标题配置OSS服务端代码初始化STS Client获取STS临时凭证创建policy计算SigningKeyOSSUtil.javaSTSPolicyDTO.java提供接口Apifox模拟Web端文件直传本文主要结合服务端STS获取临时凭证(签名)直传官方文档对开发中比较容易出错的地方加以提醒&#xff1b;建议主要…

uniapp实现微信小程序导航功能

1.导航按钮<button click"navigation()">导航到仓库</button>2.导航功能const navigation (item) > {let address item.province item.city item.district item.address //地址let latitude Number(item.latitude) …

07.4-使用 use 关键字引入路径

使用 use 关键字引入路径 每次调用函数时都必须写出完整路径&#xff0c;可能会感觉不便且重复。在清单7-7中&#xff0c;无论我们选择绝对路径还是相对路径来调用 add_to_waitlist 函数&#xff0c;每次调用时都必须指定 front_of_house 和 hosting。幸运的是&#xff0c;有一…

7.Linux :进程管理,进程控制与计划任务

Linux &#xff1a;进程管理&#xff0c;进程控制与计划任务 一、进程管理 1. 进程与程序 程序&#xff1a;静态的可执行文件&#xff08;存储于磁盘&#xff09;。进程&#xff1a;动态执行的程序实例&#xff08;占用CPU/内存&#xff09;。 2. 查看进程命令作用常用组合ps静…

Matplotlib(四)- 图表样式美化

文章目录一、Matplotlib图表样式介绍1. 图表样式简介2. 默认图表样式2.1 查看默认配置2.2 常用的配置3. 图表样式修改3.1 局部修改3.1.1 通过绘图方法设置参数修改3.1.2 通过rcParams修改3.1.3 通过rc()方法修改3.2 全局修改二、颜色设置1. 颜色的三种表示方式1.1 颜色单词1.2 …

三十四、【Linux常用工具】rsync+inotify实时同步演示

实时同步演示技术架构全景核心组件详解1. inotify 内核子系统2. Rsync 高效同步工具实践演示一、环境准备与安装1. 检查内核支持2. 安装 inotify-tools二、配置 Rsync 服务端&#xff08;目标机&#xff09;1. 创建 Rsync 配置文件2. 启动 Rsync 守护进程三、配置实时同步脚本&…

windows环境下MySQL 8.0 修改或重置密码

windows环境下MySQL 8.0 修改或重置密码 1打开命令窗口cmd&#xff0c;输入命令&#xff1a;net stop mysql&#xff0c; 停止MySQL服务&#xff0c; 开启跳过密码验证登录的MySQL服务 2输入命令 mysqld --console --skip-grant-tables --shared-memory 再打开一个新的cmd&…

基于YOLOP与GAN的图像修复与防御系统设计与实现

基于YOLOP与GAN的图像修复与防御系统设计与实现 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家&#xff0c;觉得好请收藏。点击跳转到网站。 1. 引言 1.1 研究背景 随着深度学习技术在计算机视觉领域的…

将目录文件转移到D盘,使之后的下载缓存数据转移,不再存入c盘

将 C:\Users 文件夹&#xff08;用户文件夹&#xff09;转移到其他盘是一个复杂且风险较高的操作。C:\Users 文件夹包含了系统中每个用户的个人数据和配置文件&#xff0c;修改这个路径可能会导致系统出现问题&#xff0c;包括程序无法正常工作或无法登录。因此&#xff0c; 强…

Cesium大气散射效果

由于做全球体积云效果的需要&#xff0c;再来研究下大气散射效果和体积云类似&#xff0c;关于大气散射颜色计算的过程也仅发生在这两个球体之间。如图所示。计算从相机出发的视线与球壳的交点&#xff0c;如果不相交&#xff0c;则该视线方向上不会发生大气散射&#xff0c;直…