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

Java 8-17核心特性全景解析之Java9、10

Java 9 核心特性解析

Java 9在2017年9月发布,带来了模块系统等重大变革,是Java平台现代化的重要一步。

模块系统 (Project Jigsaw)

特性概述

模块系统是Java 9最重要的特性,旨在解决Java平台和应用程序的可伸缩性问题,提供更好的封装性和依赖管理。

技术细节

模块是一个自描述的Java代码和数据的集合,通过module-info.java文件定义:

// module-info.java
module com.example.myapp {// 导出包,使其对其他模块可见exports com.example.myapp.api;// 声明对其他模块的依赖requires java.base;  // 隐式依赖,可省略requires java.sql;// 允许反射访问opens com.example.myapp.internal to com.example.framework;// 提供服务实现provides com.example.service.MyService with com.example.myapp.impl.MyServiceImpl;// 使用服务uses com.example.service.OtherService;
}

模块系统的主要概念:

  • 强封装:默认情况下,模块中的包对其他模块不可见
  • 显式依赖:模块必须声明其依赖关系
  • 可靠配置:编译时和运行时都会验证模块依赖
  • 模块化JDK:JDK本身被分解为约100个模块
应用场景
  1. 大型应用模块化
// 应用API模块
module app.api {exports com.app.api;
}// 应用实现模块
module app.impl {requires app.api;requires database.api;provides com.app.api.UserService with com.app.impl.UserServiceImpl;
}// 数据库API模块
module database.api {exports com.db.api;
}// 数据库实现模块
module database.impl {requires database.api;provides com.db.api.Repository with com.db.impl.JdbcRepository;
}
  1. 创建自定义运行时镜像
# 使用jlink创建包含所需模块的自定义运行时
jlink --module-path $JAVA_HOME/jmods:mods --add-modules app.main --output appruntime
  1. 服务加载
// 使用ServiceLoader加载服务实现
ServiceLoader<MyService> services = ServiceLoader.load(MyService.class);
for (MyService service : services) {service.doSomething();
}

JShell - 交互式Java REPL

特性概述

JShell是Java 9引入的交互式编程环境,允许开发者快速测试Java代码片段,无需编写完整的类或方法。

技术细节

JShell支持以下功能:

  • 执行表达式、语句和声明
  • 自动导入常用包
  • 代码补全和语法高亮
  • 访问执行历史
  • 保存和加载会话
# 启动JShell
$ jshell# 执行简单表达式
jshell> 2 + 2
$1 ==> 4# 定义变量
jshell> String greeting = "Hello, World!"
greeting ==> "Hello, World!"# 定义方法
jshell> int sum(int a, int b) { return a + b; }
|  已创建 方法 sum(int,int)# 使用方法
jshell> sum(10, 20)
$4 ==> 30# 查看已定义的变量和方法
jshell> /vars
|    String greeting = "Hello, World!"
|    int $4 = 30jshell> /methods
|    int sum(int,int)
应用场景
  1. 快速原型开发
// 测试新API
jshell> import java.net.http.*
jshell> var client = HttpClient.newHttpClient()
jshell> var request = HttpRequest.newBuilder().uri(URI.create("https://example.com")).build()
jshell> var response = client.send(request, HttpResponse.BodyHandlers.ofString())
jshell> response.body()
  1. 教学和学习
// 演示语言特性
jshell> var list = List.of(1, 2, 3, 4, 5)
jshell> list.stream().filter(n -> n % 2 == 0).map(n -> n * n).toList()
$2 ==> [4, 16]
  1. API探索
// 探索类方法
jshell> /imports
|    import java.io.*
|    import java.math.*
|    import java.net.*
// ...jshell> String.class.getMethods()
// 显示String类的所有方法

集合工厂方法

特性概述

Java 9引入了创建不可变集合的便捷工厂方法,使创建小型集合实例更加简洁。

技术细节

新增的工厂方法包括:

  • List.of()
  • Set.of()
  • Map.of()Map.ofEntries()
// 创建不可变List
List<String> list = List.of("Java", "Python", "JavaScript");// 创建不可变Set
Set<Integer> set = Set.of(1, 2, 3, 4, 5);// 创建不可变Map (最多10个键值对)
Map<String, Integer> map = Map.of("Java", 1995,"Python", 1991,"JavaScript", 1995
);// 创建不可变Map (超过10个键值对)
Map<String, Integer> largeMap = Map.ofEntries(Map.entry("Java", 1995),Map.entry("Python", 1991),Map.entry("JavaScript", 1995),// ...更多条目
);

这些集合有以下特点:

  • 不可变(不支持添加、删除或替换元素)
  • 不允许null元素
  • 结构紧凑,内存效率高
  • 对于Map.of(),最多支持10个键值对
应用场景
  1. 常量集合定义
// 定义常量列表
private static final List<String> SUPPORTED_LANGUAGES = List.of("Java", "Kotlin", "Scala", "Groovy");
  1. 方法返回值
// 返回不可变集合
public List<User> getDefaultUsers() {return List.of(new User("admin", Role.ADMIN),new User("guest", Role.GUEST));
}
  1. 参数传递
// 传递不可变集合作为参数
processItems(Set.of("item1", "item2", "item3"));

接口私有方法

特性概述

Java 9允许在接口中定义私有方法,进一步增强了接口的封装能力,使默认方法的代码复用更加便捷。

技术细节

接口可以定义两种私有方法:

  • 私有实例方法:供默认方法调用
  • 私有静态方法:供静态方法和默认方法调用
public interface Logger {// 公共抽象方法void log(String message);// 默认方法default void logInfo(String message) {log(addSeverity("INFO", message));}default void logWarning(String message) {log(addSeverity("WARNING", message));}default void logError(String message) {log(addSeverity("ERROR", message));}// 私有方法 - 供默认方法复用private String addSeverity(String severity, String message) {return "[" + severity + "] " + message;}// 私有静态方法private static String getCurrentTimestamp() {return LocalDateTime.now().format(DateTimeFormatter.ISO_LOCAL_DATE_TIME);}
}
应用场景
  1. 代码复用
public interface PaymentProcessor {void processPayment(Payment payment);default void processDebitPayment(DebitPayment payment) {validatePayment(payment);processPayment(payment);}default void processCreditPayment(CreditPayment payment) {validatePayment(payment);processPayment(payment);}// 私有辅助方法private void validatePayment(Payment payment) {if (payment.getAmount() <= 0) {throw new IllegalArgumentException("Payment amount must be positive");}// 其他验证逻辑}
}
  1. 接口实现辅助
public interface DataProcessor {void process(List<String> data);default void processFile(Path filePath) throws IOException {process(readLines(filePath));}// 私有辅助方法private List<String> readLines(Path filePath) throws IOException {return Files.readAllLines(filePath);}
}

改进的Stream API

特性概述

Java 9对Stream API进行了增强,添加了几个新的方法,使流处理更加灵活和强大。

技术细节

新增的Stream方法包括:

  • takeWhile(): 依次获取满足条件的元素,直到遇到第一个不满足条件的元素
  • dropWhile(): 依次丢弃满足条件的元素,直到遇到第一个不满足条件的元素
  • ofNullable(): 创建一个包含单个元素的流,如果元素为null则创建空流
  • iterate(): 增强版的迭代方法,支持终止条件
// takeWhile 示例
Stream.of(1, 2, 3, 4, 5, 1, 2).takeWhile(n -> n < 4)  // 获取元素直到遇到 >= 4 的元素.forEach(System.out::println);  // 输出: 1, 2, 3// dropWhile 示例
Stream.of(1, 2, 3, 4, 5, 1, 2).dropWhile(n -> n < 4)  // 丢弃元素直到遇到 >= 4 的元素.forEach(System.out::println);  // 输出: 4, 5, 1, 2// ofNullable 示例
Stream<String> stream = Stream.ofNullable(getNullableValue());
// 如果getNullableValue()返回null,则stream是空流// 带终止条件的iterate
Stream.iterate(1, n -> n <= 100, n -> n * 2)  // 从1开始,每次乘2,直到超过100.forEach(System.out::println);  // 输出: 1, 2, 4, 8, 16, 32, 64
应用场景
  1. 处理有序数据
// 处理有序日志,直到遇到错误日志
logs.stream().takeWhile(log -> log.getLevel() != LogLevel.ERROR).forEach(System.out::println);
  1. 数据分段处理
// 跳过所有小于阈值的数据,处理其余数据
measurements.stream().dropWhile(m -> m.getValue() < threshold).forEach(processor::process);
  1. 可能为空的数据处理
// 处理可能为null的用户数据
Stream.ofNullable(getUserData()).flatMap(Collection::stream).forEach(this::processUserData);

其他重要特性

HTTP/2客户端 (孵化)

Java 9引入了新的HTTP客户端API (incubator),支持HTTP/2和WebSocket:

// 创建HTTP客户端
HttpClient client = HttpClient.newHttpClient();// 构建请求
HttpRequest request = HttpRequest.newBuilder().uri(URI.create("https://example.com")).GET().build();// 发送同步请求
HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
System.out.println("状态码: " + response.statusCode());
System.out.println("响应体: " + response.body());// 发送异步请求
client.sendAsync(request, HttpResponse.BodyHandlers.ofString()).thenApply(HttpResponse::body).thenAccept(System.out::println).join(); // 等待完成// POST请求示例
HttpRequest postRequest = HttpRequest.newBuilder().uri(URI.create("https://example.com/users")).timeout(Duration.ofSeconds(30)).header("Content-Type", "application/json").POST(HttpRequest.BodyPublishers.ofString("{\"name\":\"张三\",\"age\":30}")).build();
多版本JAR文件

Java 9支持创建包含针对不同Java版本的类文件的JAR包:

multi-release-jar/
├── META-INF/
│   └── versions/
│       ├── 9/
│       │   └── com/example/
│       │       └── MyClass.class  # Java 9特定实现
│       └── 10/
│           └── com/example/
│               └── MyClass.class  # Java 10特定实现
└── com/└── example/└── MyClass.class          # 基础实现
改进的Javadoc

Java 9的Javadoc支持HTML5和搜索功能,并添加了新的标签:

/*** 这是一个示例类* * @apiNote 这个API的使用注意事项* @implSpec 实现规范说明* @implNote 实现细节说明*/
public class Example {// ...
}

Java 10 核心特性解析

Java 10于2018年3月发布,是Java采用新的六个月发布周期后的第一个版本,虽然特性较少,但引入了一些实用的改进。

局部变量类型推断 (var)

特性概述

Java 10引入了局部变量类型推断,允许使用var关键字声明局部变量,编译器会根据变量的初始化表达式自动推断其类型。

技术细节

var关键字的使用有以下限制:

  • 只能用于局部变量声明,不能用于方法参数、字段、返回类型等
  • 声明时必须初始化变量
  • 不能将值设为null
  • 不能用于lambda表达式的参数
// 基本用法
var text = "Hello, World!";              // 推断为String
var numbers = List.of(1, 2, 3, 4, 5);    // 推断为List<Integer>
var map = new HashMap<String, Integer>(); // 推断为HashMap<String, Integer>// 循环中使用
for (var i = 0; i < 10; i++) {System.out.println(i);
}// 增强for循环
for (var item : collection) {System.out.println(item);
}// try-with-resources
try (var reader = new BufferedReader(new FileReader("file.txt"))) {// 使用reader
}

这些集合有以下特点:

  • 不可变(不支持添加、删除或替换元素)
  • 不允许null元素
  • 结构紧凑,内存效率高
  • 对于Map.of(),最多支持10个键值对
应用场景
  1. 减少冗长的类型声明
// 传统方式
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));// 使用var
var reader = new BufferedReader(new InputStreamReader(System.in));
  1. 使用匿名类
// 传统方式
Comparator<String> comparator = new Comparator<String>() {@Overridepublic int compare(String s1, String s2) {return s1.length() - s2.length();}
};// 使用var
var comparator = new Comparator<String>() {@Overridepublic int compare(String s1, String s2) {return s1.length() - s2.length();}
};
  1. 复杂泛型类型
// 传统方式
Map<String, List<Map<Integer, String>>> complexMap = new HashMap<>();// 使用var
var complexMap = new HashMap<String, List<Map<Integer, String>>>();

G1垃圾收集器的并行Full GC

特性概述

Java 10将G1垃圾收集器的Full GC实现改为并行,显著提高了G1收集器在最坏情况下的性能。

技术细节

G1垃圾收集器在Java 9成为默认垃圾收集器,但其Full GC过程仍然是单线程的,这在大型堆上可能导致长时间停顿。Java 10改进了这一点:

  • 使用多线程并行标记-清除-压缩算法
  • 与之前的单线程实现相比,大幅减少了Full GC的停顿时间
  • 通过-XX:ParallelGCThreads参数控制并行线程数
# 启用G1收集器(Java 9+默认启用)
java -XX:+UseG1GC -XX:ParallelGCThreads=4 MyApplication
应用场景
  1. 大内存服务器应用
# 为大型服务器应用配置G1
java -XX:+UseG1GC -Xms4g -Xmx4g -XX:ParallelGCThreads=8 -XX:ConcGCThreads=2 ServerApplication
  1. 低延迟要求的应用
# 优化低延迟应用的GC配置
java -XX:+UseG1GC -XX:MaxGCPauseMillis=100 -XX:InitiatingHeapOccupancyPercent=45 LowLatencyApp

应用类数据共享 (Application Class-Data Sharing)

特性概述

Java 10扩展了类数据共享(CDS)功能,允许将应用类放入共享存档中,减少启动时间和内存占用。

技术细节

应用类数据共享(AppCDS)的工作流程:

  1. 创建类列表
  2. 创建共享存档
  3. 使用共享存档启动应用
# 步骤1:生成类列表
java -Xshare:off -XX:+UseAppCDS -XX:DumpLoadedClassList=classes.lst -cp app.jar MyApp# 步骤2:创建共享存档
java -Xshare:dump -XX:+UseAppCDS -XX:SharedClassListFile=classes.lst -XX:SharedArchiveFile=app.jsa -cp app.jar# 步骤3:使用共享存档启动应用
java -Xshare:on -XX:+UseAppCDS -XX:SharedArchiveFile=app.jsa -cp app.jar MyApp
应用场景
  1. 微服务和容器化应用
# 为Docker容器中的微服务创建共享存档
java -Xshare:dump -XX:+UseAppCDS -XX:SharedClassListFile=microservice.lst -XX:SharedArchiveFile=microservice.jsa -cp microservice.jar
  1. 频繁启动的应用
# 优化命令行工具的启动时间
java -Xshare:on -XX:+UseAppCDS -XX:SharedArchiveFile=tool.jsa -cp tool.jar CommandLineTool

其他重要特性

基于时间的发布版本控制

Java 10开始采用基于时间的版本号格式:$FEATURE.$INTERIM.$UPDATE.$PATCH

  • FEATURE:每六个月发布一次的功能版本
  • INTERIM:中间版本(预留)
  • UPDATE:兼容性更新版本
  • PATCH:紧急修复版本

例如:Java 10.0.1表示第10个功能版本的第1个更新版本。

统一的垃圾收集器接口

Java 10引入了一个统一的垃圾收集器接口,使得实现新的垃圾收集器更加容易,并简化了现有收集器的代码。

线程局部握手

Java 10引入了线程局部握手机制,允许JVM在不停止全部线程的情况下,停止单个线程,提高了GC等操作的效率。

移除了JavaEE和CORBA模块

Java 10移除了Java EE和CORBA模块,这些模块在Java 9中已被标记为废弃:

  • javax.activation
  • javax.xml.bind
  • javax.xml.ws
  • javax.xml.ws.annotation
  • javax.jws
  • javax.jws.soap
  • javax.transaction
  • javax.xml.soap
  • org.omg.CORBA
  • 等等
额外的Unicode语言标签扩展

Java 10增强了java.util.Locale类和相关的API,支持更多的BCP 47语言标签。

根证书

Java 10在JDK中添加了一组默认的根证书,提高了开箱即用的安全性.

相关文章:

Java 8-17核心特性全景解析之Java9、10

Java 9 核心特性解析 Java 9在2017年9月发布&#xff0c;带来了模块系统等重大变革&#xff0c;是Java平台现代化的重要一步。 模块系统 (Project Jigsaw) 特性概述 模块系统是Java 9最重要的特性&#xff0c;旨在解决Java平台和应用程序的可伸缩性问题&#xff0c;提供更好…...

mysql的学习

关系性数据库需要遵循ACID规则 原子性&#xff1a; 事务是最小的执行单位&#xff0c;不允许分割。事务的原子性确保动作要么全部完成&#xff0c;要么完全不起作用&#xff1b; 一致性&#xff1a; 执行事务前后&#xff0c;数据保持一致&#xff0c;例如转账业务中&#xff…...

leecode 560题

一、题目解析 题目如下->: 这道题的问题是&#xff0c;找到目标值为k的所有连续子串个数&#xff0c;因此最简单最容易想到的就是枚举 两个指针枚举起来确实可以解决&#xff0c;但是时间复杂度极大&#xff0c;达到了O(n^2)的级别 因此这不是我们想要的 二、解题思路 2.1 …...

借壹起航东风,中国工厂出海开启新征程

在经济全球化不断深入的当下&#xff0c;中国工厂正以积极的姿态投身海外市场&#xff0c;渴望在全球商业版图中占据一席之地&#xff0c;绽放独特的光彩。然而&#xff0c;出海之路充满了挑战与艰辛&#xff0c;品牌塑造困难重重、询盘量不稳定、营销成本居高不下等问题&#…...

Joomla教程—查看网站的前台页面与菜单管理(栏目管理)

原文&#xff1a;Joomla 查看网站的前台页面_w3cschool 在本节中&#xff0c;我们将简单介绍一下JOOMLA的前台界面。通过本节的介绍&#xff0c;希望你能对JOOMLA的界面组成有一个大致的了解。 你可以直接在浏览器中输入http://localhost/zmax/ 就会出现我们网站的首页了。也…...

HCIA-WLAN实验

1、划分VLAN&#xff0c;配置IP地址 2、配置AC作为AP的DHCP服务器自动为AP分配IP地址 dhcp enable interface Vlanif100 dhcp select interface 3、建立CAPWAP隧道 capwap source interface vlanif100 4、配置WLAN业务配置&#xff0c;下发至AP ①配置&#xff1a;wlan …...

DNA-PAINT

参考: 【科研教程】NUPACK网页版使用教程 https://www.bilibili.com/video/BV1G94y1W7mN/NUPACK新版网页版教程-模拟部分 https://zhuanlan.zhihu.com/p/678730568NUPACK 4.0 User Guide https://docs.nupack.org/NUPACK网页版使用指南 https://zhuanlan.zhihu.com/p/55024017…...

VS2022的第一个Qt程序——实战《加载并显示图像》

目录 一、UI设计 S1&#xff1a;双击Form Files下.ui文件&#xff0c;进入ui设计界面Qt Designer S2&#xff1a;然后拖动一个Push Button和Label控件到界面 S3&#xff1a;点击信号与槽&#xff0c;然后点击PushButton往外拉一下 S4&#xff1a;松开鼠标进入配置连接界面…...

从概率到梯度:理解分类问题中交叉熵的优越性

分类问题一般使用交叉熵&#xff08;Cross-Entropy&#xff09;而不是平方损失&#xff08;Square Loss&#xff09;函数1. **概率解释**2. **梯度性质**3. **对错误的惩罚**4. **计算复杂度**5. **总结** 分类问题一般使用交叉熵&#xff08;Cross-Entropy&#xff09;而不是平…...

如何选择?Postman vs JMeter 对比介绍

Postman 和 JMeter 作为两款主流测试工具&#xff0c;各有特色。本文将从多个维度详细对比这两款工具最新特性和应用场景。 工具基本介绍 对比项 Postman JMeter 类型 API 开发和测试工具 性能测试工具 开源情况 闭源&#xff0c;提供免费版 开源&#xff08;Apache L…...

P1182 数列分段 Section II

P1182 数列分段 Section II - 洛谷 题目描述 对于给定的一个长度为 N 的正整数数列 A1​∼AN​&#xff0c;现要将其分成 M&#xff08;M≤N&#xff09;段&#xff0c;并要求每段连续&#xff0c;且每段和的最大值最小。 关于最大值最小&#xff1a; 例如一数列 4 2 4 5 1…...

Thales靶场

信息收集 将靶机改为net模式&#xff0c;开启kali进行扫描&#xff0c;得到靶机ip 对靶机的端口&#xff0c;目录进行扫描&#xff0c;8080端口是 apache tomcat代理 进入8080端口&#xff0c;点击app出现登录窗口&#xff0c;弱口令没试出来&#xff0c;可以爆破登录窗口 查…...

系统思考—看见未来

感谢上海财经大学终身教育学院的持续邀请&#xff01;每个月&#xff0c;都会带着不同的思维火花&#xff0c;走进财大与学员们一起探索系统思考的奥秘。 这次为宜宾市的干部们带来了一场深刻的学习体验。通过系统思考&#xff0c;帮助大家从整体视角去发现问题、分析问题、解…...

第30周Java分布式入门 ThreadLocal

ThreadLocal 课程笔记 一、章节结构概述 本章主要学习重要的工具类 ThreadLocal。章节分为六大模块&#xff1a; ThreadLocal 的两大使用场景ThreadLocal 所带来的好处ThreadLocal 的主要方法及使用顺序ThreadLocal 原理源码分析使用 ThreadLocal 的注意点和使用规范 从下一…...

Windows 10 LTSC 2019 中文版下载及安装教程(附安装包)

&#xff08;cn_windows_10_enterprise_ltsc_2019_x64_dvd_9c09ff24&#xff09;涵盖常见疑问和注意事项&#xff1a; cn_windows_10_enterprise_ltsc_2019_x64_dvd_9c09ff24 下载链接&#xff1a;https://pan.quark.cn/s/c2c8f3cd18f1 1. 镜像文件来源与合法性 官方渠道&…...

死亡并不是走出生命 而是走出时间

目录 第一章 倒春寒 第二章 悖论与共生 第三章 坍缩与永恒 第四章 在时差里相爱 终章 你从未离开 第一章 倒春寒 2022年春天的扬州东关街&#xff0c;青衣在文昌阁古槐下调试着「时间胶囊」算法。这个能将人类记忆转化为数据流的程序&#xff0c;是他用三年时间对抗渐冻…...

Langchain中的表格解析:RAG 和表格的爱恨情仇

实现 RAG(Retrieval-Augmented Generation)是一个挑战,尤其是在有效解析和理解非结构化文档中的表格时。这在处理扫描文档或图像格式的文档时尤为困难。这些挑战至少包括以下三个方面: 1.表格的“叛逆期”:不准确的解析可能会破坏表格结构: 表格在文档里就像个叛逆的青少…...

STM32F103_LL库+寄存器学习笔记02 - 开启SysTick(滴答定时器)中断

导言 《STM32F103_LL库寄存器学习笔记01 - 梳理CubeMX生成的LL库最小的裸机系统框架》上一章节对CubeMX生成的最小系统框架进行梳理&#xff0c;在此工程的基础上&#xff0c;梳理SysTick&#xff08;滴答定时器&#xff09;中断是怎样开启的&#xff1f;为什么SysTick中断会自…...

AI小白的第七天:必要的数学知识(概率)

概率 Probability 1. 概率的定义 概率是一个介于 0 和 1 之间的数&#xff0c;表示某个事件发生的可能性&#xff1a; 0&#xff1a;事件不可能发生。1&#xff1a;事件必然发生。0 到 1 之间&#xff1a;事件发生的可能性大小。 例如&#xff0c;掷一枚公平的硬币&#xf…...

SVN常用命令

SVN常用命令 基本操作命令 • 检出代码&#xff08;Checkout&#xff09;&#xff1a;从SVN服务器获取代码到本地。 svn checkout [svn服务器url] [检出本地的path] 示例&#xff1a; svn checkout svn://47.106.183.193/helloworld ./ • 提交代码&#xff08;Commit&…...

23种设计模式中的策略模式

在策略模式定义了一系列算法或策略&#xff0c;并将每个算法封装在独立的类中&#xff0c;使得它们可以互相替换。通过使用策略模式&#xff0c;可以在运行时根据需要选择不同的算法&#xff0c;而不需要修改客户端代码。 策略模式&#xff1a;Strategy。指的是&#xff0c;定义…...

车载通信方案为何选择CAN/CANFD?

摘要 随着汽车电子技术的飞速发展&#xff0c;车载通信系统在车辆的智能化、网联化进程中扮演着至关重要的角色。控制器局域网络&#xff08;CAN&#xff09;及其扩展版本CANFD凭借其卓越的可靠性、高效的数据传输能力和强大的抗干扰特性&#xff0c;成为现代汽车通信架构的核心…...

有价值的面试问题

迅雷一面 都是c和网络问题 了解epoll吗&#xff1f;解释下水平触发和边缘触发&#xff0c;医院的叫号系统应该算哪一种 c类a有成员b&#xff0c;成员b调用了a的函数&#xff0c;但是a不小心把b的成员删除了&#xff0c;会发生什么&#xff0c;怎么解决 c类a有一个static的函数…...

深度学习|表示学习|多头注意力在计算时常见的张量维度变换总结|28

如是我闻&#xff1a; 以下是多头注意力&#xff08;Multi-Headed Attention&#xff09;在计算时常见的张量维度变换总结&#xff0c;帮助理解从输入到输出是如何一步步处理的。为了方便&#xff0c;令&#xff1a; B B B 表示 batch size&#xff08;批量大小&#xff09; S …...

Mysql内置函数篇

&#x1f3dd;️专栏&#xff1a;Mysql_猫咪-9527的博客-CSDN博客 &#x1f305;主页&#xff1a;猫咪-9527-CSDN博客 “欲穷千里目&#xff0c;更上一层楼。会当凌绝顶&#xff0c;一览众山小。” 目录 7.函数 7.1 日期函数 函数总&#xff1a;​编辑 获得当前日期 获得…...

使用事件监听器来处理并发环境中RabbitMQ的同步响应问题

RabbitListener 是 Spring AMQP 提供的核心注解&#xff0c;用于简化 RabbitMQ 消息监听器的创建。以下是对 RabbitListener(queues "balloonWords.queue") 的详细解析&#xff1a; 一、基础功能 队列监听 通过 queues 属性指定监听的队列名称&#xff08;如 "…...

基于Java的班级事务管理系统(源码+lw+部署文档+讲解),源码可白嫖!

摘要 随着世界经济信息化、全球化的到来和电子商务的飞速发展&#xff0c;推动了很多行业的改革。若想达到安全&#xff0c;快捷的目的&#xff0c;就需要拥有信息化的组织和管理模式&#xff0c;建立一套合理、畅通、高效的线上管理系统。当前的班级事务管理存在管理效率低下…...

Rviz 同时显示多个独立 URDF!解决双机械臂+底盘等场景(球体+方块实例演示)

视频讲解&#xff1a; Rviz 同时显示多个独立 URDF&#xff01;解决双机械臂底盘等场景&#xff08;球体方块实例演示&#xff09; 仓库地址&#xff1a;GitHub - LitchiCheng/ros2_package 有小伙伴留言说想看下同时使用多个独立的urdf如何配置&#xff0c;实际上这个场景是很…...

【C++】--- 类和对象(中)之日期类的实现

日期类的实现 1. 应该实现哪些默认成员函数 构造函数是需要自己来实现的&#xff0c;因为日期类的成员变量都是内置类型&#xff0c;是否初始化取决于编译器&#xff0c;这里可以给出一个带参全缺省的构造函数,由于日期类不需要申请资源&#xff0c;所有不用显式的实现析构函…...

kafka基础

一:消息队列(message queue [MQ]): 1.1消息队列解释:用来存储消息的队列 简单理解就是将需要的数据传输到队列里,队列可存可取,like 一个管道&#xff0c;但是与hdfs不同的是kafka作为临时存储 1.2消息队列中间件 消息队列中间件其实就是一个组件,简单例子就是用户对于服务器产…...

蓝桥杯第十届 特别的数

题目描述 小明对数位中含有 2、0、1、9 的数字很感兴趣&#xff08;不包括前导 0&#xff09;&#xff0c;在 1 到 40 中这样的数包括 1、2、9、10 至 32、39 和 40&#xff0c;共 28 个&#xff0c;他们的和是 574。 请问&#xff0c;在 1 到 n 中&#xff0c;所有这样的数的…...

fpga pcie

pcie reg 介绍 debug pcie issue using lspci & setpci 介绍了lspci & setpci用法&#xff0c; 以及fpga pcie调试过程中重点关注的reg Lspci -tv Sudo lspci -vvv -s 18:00.0 Sudo lspci -nvmms 18:00.0 setpci --dumpregs setpci -s 18:00.0 COMMAND #&#x…...

模数转换电路(A/D转换器)

A/D转换&#xff0c;是将输入的模拟电压量转换成相应的数字量。 A/D转换器的类型很多&#xff0c;按工作原理可分为直接转换型和间接转换型两大类。前者直接将模拟电压量转换成数字量&#xff0c;后者是先将模拟电压量转换成一个中间量&#xff0c;再将中间量转换成数字量。 …...

PAT乙级1007

常规解法 #include <iostream> using namespace std;// 判断一个数是否为素数的函数 bool isprime(int a) {// 遍历 2 到 sqrt(a) 之间的数&#xff0c;判断 a 是否能被它们整除for (int i 2; i * i < a; i) {if (a % i 0) // 如果能整除&#xff0c;说明 a 不是素…...

代码随想录刷题day52|(二叉树篇)106.从中序与后序遍历序列构造二叉树

目录 一、二叉树理论知识 二、构造二叉树思路 2.1 构造二叉树流程&#xff08;给定中序后序 2.2 整体步骤 2.3 递归思路 2.4 给定前序和后序 三、相关算法题目 四、易错点 一、二叉树理论知识 详见&#xff1a;代码随想录刷题day34|&#xff08;二叉树篇&#xff09;二…...

MTK平台 Android12-Android13 默认搜狗输入法

系统默认搜狗输入法功能实现 文章目录 需求&#xff1a;场景 参考资料需求实现内置搜狗输入法配置第三方apk .mk 和 搜狗安装包&#xff0c;不可卸载方式搜狗输入法module 配置到系统device.mk 中去 设置搜狗输入法为默认输入法给输入法授权&#xff0c;默认所有权限 总结思考 …...

vue3实现动态路由

文章目录 一、基础信息1.路由构成2.菜单配置表3.vue-router4方法 二、实现思路1.登录获取菜单配置表2.导航守卫3.添加动态路由4.渲染菜单5.退出登录删除动态路由 三、实现代码1.路由守卫2.基础路由文件3.添加动态路由逻辑4.待特殊处理路由配置表5.404类路由6.删除动态路由 场景…...

行为型设计模式

深入理解行为型设计模式&#xff1a;模板方法、观察者、责任链 设计模式是软件开发中解决常见问题的经典方案&#xff0c;而行为型设计模式尤其关注对象之间的职责分配与通信方式。本文将详细讲解模板方法模式、观察者模式和责任链模式。 一、模板方法模式&#xff08;Templat…...

【服务器环境安装指南-指定 cuda 版本】在 Ubuntu 22.04 上完成 cuda-toolkit 12.0 和 cudnn 12.x 的安装教程

0.引言 在深度学习和高性能计算领域&#xff0c;CUDA 和 cuDNN 是不可或缺的工具。为充分发挥硬件性能&#xff0c;我们需要在服务器环境中正确配置这些工具。然而&#xff0c;安装过程中可能会遇到诸多挑战&#xff0c;例如版本兼容性和环境变量设置等问题。本篇文章将以 Ubu…...

蓝桥杯第十届 数的分解

题目描述 本题为填空题&#xff0c;只需要算出结果后&#xff0c;在代码中使用输出语句将所填结果输出即可。 把 2019 分解成 3 个各不相同的正整数之和&#xff0c;并且要求每个正整数都不包含数字 2 和 4&#xff0c;一共有多少种不同的分解方法&#xff1f; 注意交换 3 个…...

二叉搜索树

目录 概念 代码实现 成员 基本结构 查找 插入 删除 中序遍历 拷贝构造 赋值运算符重载 析构函数 递归实现 递归实现查找 递归实现插入 递归实现删除 概念 关于二叉树的基本结构已经进行过详细剖析&#xff0c;本篇博客将对一种特殊的二叉树进行分析。 二叉树&…...

Linux多线程详解

Linux多线程详解 一、Linux多线程概念1.1 什么是线程1.2 进程和线程1.3 进程的多个线程共享1.4 进程和线程的关系 二、Linux线程控制2.1 POSIX线程库2.2 线程创建2.3 获取线程ID pthread_self2.4 线程等待pthread_join2.5 线程终止2.6 线程栈 && pthread_t2.7 线程的局…...

攻防世界-web-1

Training-WWW-Robots 在URL后面加上/robots.txt 直接在URL后面添加/fl0g.php PHP2 他问我能不能登录这个网站&#xff0c;又因为考察php内容&#xff0c;在URL后面添加/index.php&#xff0c;无任何回显 试试/index.phps 分析一下代码&#xff0c;发现要用get方式上传idadmin,…...

笔记本+移动端维修全套教程

今天分享的是笔记本移动端维修全套教程&#xff08;免费视频资料大全&#xff09; 当自己手机或者电脑坏了&#xff0c;很多人都会想着去维修店铺修&#xff0c;但价格不透明&#xff0c;容易被坑&#xff0c;当自己了解一些之后&#xff0c;即使不会修&#xff0c;也可以对手…...

【STM32】知识点介绍二:GPIO引脚介绍

文章目录 一、概述二、GPIO的工作模式三、寄存器编程 一、概述 GPIO&#xff08;英语&#xff1a;General-purpose input/output&#xff09;,即通用I/O(输入/输出)端口&#xff0c;是STM32可控制的引脚。STM32芯片的GPIO引脚与外部设备连接起来&#xff0c;可实现与外部通讯、…...

【STM32】GPIO

目录 1、什么是GPIO2、什么是GPIO组3、GPIO的基本结构4、GPIO位结构5、GPIO八种工作模式6、GPIO相关寄存器1. 端口配置低寄存器GPIO[x]_CRL和端口配置高寄存器GPIO[x]_CRH, Config Register High和Config Register Low)2. 端口输入数据寄存器(GPIO[x]_IDR)3. 端口输出数据寄存器…...

鸿蒙移动应用开发--UI组件布局

实验要求&#xff1a; 制作一个B站视频卡片界面&#xff0c;大致如下图所示&#xff0c;要求应用到线性布局、层叠布局等相关课堂知识。背景图、logo及文本内容不限。 实验环境 &#xff1a;DevEco Studio 实验过程&#xff1a; 步骤1&#xff1a;创建项目 1. 在您的开发环境…...

[MySQL]MySQL数据库基础知识与操作

MySQL基础知识 为什么要有数据库&#xff1f; 文件存储的缺点 1.没有以某种特定的数据格式存储数据&#xff0c;查找不方便&#xff0c;只能遍历2.安全性&#xff1a;数据误操作后不能回滚3.每次操作数据都要用户自己操作4.数据量大的时候&#xff0c;操作的成本很高 创建一…...

卡诺图化简法的原理

引子 若两个最小项只有一个因子不同&#xff0c;则称这两个最小项具有相邻性。 例如&#xff0c; A ′ B C ′ ABC A′BC′和 A B C ABC ABC两个最小项仅第一个因子不同&#xff0c;所以它们具有相邻性。这两个最小项相加时定能合并成一项并将一对不同的因子消去 A ′ B C ′…...

从零开始:使用Luatools工具高效烧录Air780EPM核心板项目的完整指南

本文将深入讲解如何使用Luatools工具烧录一个具体的项目到Air780EPM开发板中。如何使用官方推荐的Luatools工具&#xff08;一款跨平台、命令行驱动的烧录利器&#xff09;&#xff0c;通过“环境配置→硬件连接→参数设置→一键烧录”四大步骤&#xff0c;帮助用户实现Air780E…...