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个模块
应用场景
- 大型应用模块化
// 应用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;
}
- 创建自定义运行时镜像
# 使用jlink创建包含所需模块的自定义运行时
jlink --module-path $JAVA_HOME/jmods:mods --add-modules app.main --output appruntime
- 服务加载
// 使用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)
应用场景
- 快速原型开发
// 测试新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()
- 教学和学习
// 演示语言特性
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]
- 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个键值对
应用场景
- 常量集合定义
// 定义常量列表
private static final List<String> SUPPORTED_LANGUAGES = List.of("Java", "Kotlin", "Scala", "Groovy");
- 方法返回值
// 返回不可变集合
public List<User> getDefaultUsers() {return List.of(new User("admin", Role.ADMIN),new User("guest", Role.GUEST));
}
- 参数传递
// 传递不可变集合作为参数
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);}
}
应用场景
- 代码复用
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");}// 其他验证逻辑}
}
- 接口实现辅助
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
应用场景
- 处理有序数据
// 处理有序日志,直到遇到错误日志
logs.stream().takeWhile(log -> log.getLevel() != LogLevel.ERROR).forEach(System.out::println);
- 数据分段处理
// 跳过所有小于阈值的数据,处理其余数据
measurements.stream().dropWhile(m -> m.getValue() < threshold).forEach(processor::process);
- 可能为空的数据处理
// 处理可能为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个键值对
应用场景
- 减少冗长的类型声明
// 传统方式
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));// 使用var
var reader = new BufferedReader(new InputStreamReader(System.in));
- 使用匿名类
// 传统方式
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();}
};
- 复杂泛型类型
// 传统方式
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
应用场景
- 大内存服务器应用
# 为大型服务器应用配置G1
java -XX:+UseG1GC -Xms4g -Xmx4g -XX:ParallelGCThreads=8 -XX:ConcGCThreads=2 ServerApplication
- 低延迟要求的应用
# 优化低延迟应用的GC配置
java -XX:+UseG1GC -XX:MaxGCPauseMillis=100 -XX:InitiatingHeapOccupancyPercent=45 LowLatencyApp
应用类数据共享 (Application Class-Data Sharing)
特性概述
Java 10扩展了类数据共享(CDS)功能,允许将应用类放入共享存档中,减少启动时间和内存占用。
技术细节
应用类数据共享(AppCDS)的工作流程:
- 创建类列表
- 创建共享存档
- 使用共享存档启动应用
# 步骤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
应用场景
- 微服务和容器化应用
# 为Docker容器中的微服务创建共享存档
java -Xshare:dump -XX:+UseAppCDS -XX:SharedClassListFile=microservice.lst -XX:SharedArchiveFile=microservice.jsa -cp microservice.jar
- 频繁启动的应用
# 优化命令行工具的启动时间
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月发布,带来了模块系统等重大变革,是Java平台现代化的重要一步。 模块系统 (Project Jigsaw) 特性概述 模块系统是Java 9最重要的特性,旨在解决Java平台和应用程序的可伸缩性问题,提供更好…...
mysql的学习
关系性数据库需要遵循ACID规则 原子性: 事务是最小的执行单位,不允许分割。事务的原子性确保动作要么全部完成,要么完全不起作用; 一致性: 执行事务前后,数据保持一致,例如转账业务中ÿ…...
leecode 560题
一、题目解析 题目如下->: 这道题的问题是,找到目标值为k的所有连续子串个数,因此最简单最容易想到的就是枚举 两个指针枚举起来确实可以解决,但是时间复杂度极大,达到了O(n^2)的级别 因此这不是我们想要的 二、解题思路 2.1 …...
借壹起航东风,中国工厂出海开启新征程
在经济全球化不断深入的当下,中国工厂正以积极的姿态投身海外市场,渴望在全球商业版图中占据一席之地,绽放独特的光彩。然而,出海之路充满了挑战与艰辛,品牌塑造困难重重、询盘量不稳定、营销成本居高不下等问题&#…...
Joomla教程—查看网站的前台页面与菜单管理(栏目管理)
原文:Joomla 查看网站的前台页面_w3cschool 在本节中,我们将简单介绍一下JOOMLA的前台界面。通过本节的介绍,希望你能对JOOMLA的界面组成有一个大致的了解。 你可以直接在浏览器中输入http://localhost/zmax/ 就会出现我们网站的首页了。也…...
HCIA-WLAN实验
1、划分VLAN,配置IP地址 2、配置AC作为AP的DHCP服务器自动为AP分配IP地址 dhcp enable interface Vlanif100 dhcp select interface 3、建立CAPWAP隧道 capwap source interface vlanif100 4、配置WLAN业务配置,下发至AP ①配置: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:双击Form Files下.ui文件,进入ui设计界面Qt Designer S2:然后拖动一个Push Button和Label控件到界面 S3:点击信号与槽,然后点击PushButton往外拉一下 S4:松开鼠标进入配置连接界面…...
从概率到梯度:理解分类问题中交叉熵的优越性
分类问题一般使用交叉熵(Cross-Entropy)而不是平方损失(Square Loss)函数1. **概率解释**2. **梯度性质**3. **对错误的惩罚**4. **计算复杂度**5. **总结** 分类问题一般使用交叉熵(Cross-Entropy)而不是平…...
如何选择?Postman vs JMeter 对比介绍
Postman 和 JMeter 作为两款主流测试工具,各有特色。本文将从多个维度详细对比这两款工具最新特性和应用场景。 工具基本介绍 对比项 Postman JMeter 类型 API 开发和测试工具 性能测试工具 开源情况 闭源,提供免费版 开源(Apache L…...
P1182 数列分段 Section II
P1182 数列分段 Section II - 洛谷 题目描述 对于给定的一个长度为 N 的正整数数列 A1∼AN,现要将其分成 M(M≤N)段,并要求每段连续,且每段和的最大值最小。 关于最大值最小: 例如一数列 4 2 4 5 1…...
Thales靶场
信息收集 将靶机改为net模式,开启kali进行扫描,得到靶机ip 对靶机的端口,目录进行扫描,8080端口是 apache tomcat代理 进入8080端口,点击app出现登录窗口,弱口令没试出来,可以爆破登录窗口 查…...
系统思考—看见未来
感谢上海财经大学终身教育学院的持续邀请!每个月,都会带着不同的思维火花,走进财大与学员们一起探索系统思考的奥秘。 这次为宜宾市的干部们带来了一场深刻的学习体验。通过系统思考,帮助大家从整体视角去发现问题、分析问题、解…...
第30周Java分布式入门 ThreadLocal
ThreadLocal 课程笔记 一、章节结构概述 本章主要学习重要的工具类 ThreadLocal。章节分为六大模块: ThreadLocal 的两大使用场景ThreadLocal 所带来的好处ThreadLocal 的主要方法及使用顺序ThreadLocal 原理源码分析使用 ThreadLocal 的注意点和使用规范 从下一…...
Windows 10 LTSC 2019 中文版下载及安装教程(附安装包)
(cn_windows_10_enterprise_ltsc_2019_x64_dvd_9c09ff24)涵盖常见疑问和注意事项: cn_windows_10_enterprise_ltsc_2019_x64_dvd_9c09ff24 下载链接:https://pan.quark.cn/s/c2c8f3cd18f1 1. 镜像文件来源与合法性 官方渠道&…...
死亡并不是走出生命 而是走出时间
目录 第一章 倒春寒 第二章 悖论与共生 第三章 坍缩与永恒 第四章 在时差里相爱 终章 你从未离开 第一章 倒春寒 2022年春天的扬州东关街,青衣在文昌阁古槐下调试着「时间胶囊」算法。这个能将人类记忆转化为数据流的程序,是他用三年时间对抗渐冻…...
Langchain中的表格解析:RAG 和表格的爱恨情仇
实现 RAG(Retrieval-Augmented Generation)是一个挑战,尤其是在有效解析和理解非结构化文档中的表格时。这在处理扫描文档或图像格式的文档时尤为困难。这些挑战至少包括以下三个方面: 1.表格的“叛逆期”:不准确的解析可能会破坏表格结构: 表格在文档里就像个叛逆的青少…...
STM32F103_LL库+寄存器学习笔记02 - 开启SysTick(滴答定时器)中断
导言 《STM32F103_LL库寄存器学习笔记01 - 梳理CubeMX生成的LL库最小的裸机系统框架》上一章节对CubeMX生成的最小系统框架进行梳理,在此工程的基础上,梳理SysTick(滴答定时器)中断是怎样开启的?为什么SysTick中断会自…...
AI小白的第七天:必要的数学知识(概率)
概率 Probability 1. 概率的定义 概率是一个介于 0 和 1 之间的数,表示某个事件发生的可能性: 0:事件不可能发生。1:事件必然发生。0 到 1 之间:事件发生的可能性大小。 例如,掷一枚公平的硬币…...
SVN常用命令
SVN常用命令 基本操作命令 • 检出代码(Checkout):从SVN服务器获取代码到本地。 svn checkout [svn服务器url] [检出本地的path] 示例: svn checkout svn://47.106.183.193/helloworld ./ • 提交代码(Commit&…...
23种设计模式中的策略模式
在策略模式定义了一系列算法或策略,并将每个算法封装在独立的类中,使得它们可以互相替换。通过使用策略模式,可以在运行时根据需要选择不同的算法,而不需要修改客户端代码。 策略模式:Strategy。指的是,定义…...
车载通信方案为何选择CAN/CANFD?
摘要 随着汽车电子技术的飞速发展,车载通信系统在车辆的智能化、网联化进程中扮演着至关重要的角色。控制器局域网络(CAN)及其扩展版本CANFD凭借其卓越的可靠性、高效的数据传输能力和强大的抗干扰特性,成为现代汽车通信架构的核心…...
有价值的面试问题
迅雷一面 都是c和网络问题 了解epoll吗?解释下水平触发和边缘触发,医院的叫号系统应该算哪一种 c类a有成员b,成员b调用了a的函数,但是a不小心把b的成员删除了,会发生什么,怎么解决 c类a有一个static的函数…...
深度学习|表示学习|多头注意力在计算时常见的张量维度变换总结|28
如是我闻: 以下是多头注意力(Multi-Headed Attention)在计算时常见的张量维度变换总结,帮助理解从输入到输出是如何一步步处理的。为了方便,令: B B B 表示 batch size(批量大小) S …...
Mysql内置函数篇
🏝️专栏:Mysql_猫咪-9527的博客-CSDN博客 🌅主页:猫咪-9527-CSDN博客 “欲穷千里目,更上一层楼。会当凌绝顶,一览众山小。” 目录 7.函数 7.1 日期函数 函数总:编辑 获得当前日期 获得…...
使用事件监听器来处理并发环境中RabbitMQ的同步响应问题
RabbitListener 是 Spring AMQP 提供的核心注解,用于简化 RabbitMQ 消息监听器的创建。以下是对 RabbitListener(queues "balloonWords.queue") 的详细解析: 一、基础功能 队列监听 通过 queues 属性指定监听的队列名称(如 "…...
基于Java的班级事务管理系统(源码+lw+部署文档+讲解),源码可白嫖!
摘要 随着世界经济信息化、全球化的到来和电子商务的飞速发展,推动了很多行业的改革。若想达到安全,快捷的目的,就需要拥有信息化的组织和管理模式,建立一套合理、畅通、高效的线上管理系统。当前的班级事务管理存在管理效率低下…...
Rviz 同时显示多个独立 URDF!解决双机械臂+底盘等场景(球体+方块实例演示)
视频讲解: Rviz 同时显示多个独立 URDF!解决双机械臂底盘等场景(球体方块实例演示) 仓库地址:GitHub - LitchiCheng/ros2_package 有小伙伴留言说想看下同时使用多个独立的urdf如何配置,实际上这个场景是很…...
【C++】--- 类和对象(中)之日期类的实现
日期类的实现 1. 应该实现哪些默认成员函数 构造函数是需要自己来实现的,因为日期类的成员变量都是内置类型,是否初始化取决于编译器,这里可以给出一个带参全缺省的构造函数,由于日期类不需要申请资源,所有不用显式的实现析构函…...
kafka基础
一:消息队列(message queue [MQ]): 1.1消息队列解释:用来存储消息的队列 简单理解就是将需要的数据传输到队列里,队列可存可取,like 一个管道,但是与hdfs不同的是kafka作为临时存储 1.2消息队列中间件 消息队列中间件其实就是一个组件,简单例子就是用户对于服务器产…...
蓝桥杯第十届 特别的数
题目描述 小明对数位中含有 2、0、1、9 的数字很感兴趣(不包括前导 0),在 1 到 40 中这样的数包括 1、2、9、10 至 32、39 和 40,共 28 个,他们的和是 574。 请问,在 1 到 n 中,所有这样的数的…...
fpga pcie
pcie reg 介绍 debug pcie issue using lspci & setpci 介绍了lspci & setpci用法, 以及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转换,是将输入的模拟电压量转换成相应的数字量。 A/D转换器的类型很多,按工作原理可分为直接转换型和间接转换型两大类。前者直接将模拟电压量转换成数字量,后者是先将模拟电压量转换成一个中间量,再将中间量转换成数字量。 …...
PAT乙级1007
常规解法 #include <iostream> using namespace std;// 判断一个数是否为素数的函数 bool isprime(int a) {// 遍历 2 到 sqrt(a) 之间的数,判断 a 是否能被它们整除for (int i 2; i * i < a; i) {if (a % i 0) // 如果能整除,说明 a 不是素…...
代码随想录刷题day52|(二叉树篇)106.从中序与后序遍历序列构造二叉树
目录 一、二叉树理论知识 二、构造二叉树思路 2.1 构造二叉树流程(给定中序后序 2.2 整体步骤 2.3 递归思路 2.4 给定前序和后序 三、相关算法题目 四、易错点 一、二叉树理论知识 详见:代码随想录刷题day34|(二叉树篇)二…...
MTK平台 Android12-Android13 默认搜狗输入法
系统默认搜狗输入法功能实现 文章目录 需求:场景 参考资料需求实现内置搜狗输入法配置第三方apk .mk 和 搜狗安装包,不可卸载方式搜狗输入法module 配置到系统device.mk 中去 设置搜狗输入法为默认输入法给输入法授权,默认所有权限 总结思考 …...
vue3实现动态路由
文章目录 一、基础信息1.路由构成2.菜单配置表3.vue-router4方法 二、实现思路1.登录获取菜单配置表2.导航守卫3.添加动态路由4.渲染菜单5.退出登录删除动态路由 三、实现代码1.路由守卫2.基础路由文件3.添加动态路由逻辑4.待特殊处理路由配置表5.404类路由6.删除动态路由 场景…...
行为型设计模式
深入理解行为型设计模式:模板方法、观察者、责任链 设计模式是软件开发中解决常见问题的经典方案,而行为型设计模式尤其关注对象之间的职责分配与通信方式。本文将详细讲解模板方法模式、观察者模式和责任链模式。 一、模板方法模式(Templat…...
【服务器环境安装指南-指定 cuda 版本】在 Ubuntu 22.04 上完成 cuda-toolkit 12.0 和 cudnn 12.x 的安装教程
0.引言 在深度学习和高性能计算领域,CUDA 和 cuDNN 是不可或缺的工具。为充分发挥硬件性能,我们需要在服务器环境中正确配置这些工具。然而,安装过程中可能会遇到诸多挑战,例如版本兼容性和环境变量设置等问题。本篇文章将以 Ubu…...
蓝桥杯第十届 数的分解
题目描述 本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可。 把 2019 分解成 3 个各不相同的正整数之和,并且要求每个正整数都不包含数字 2 和 4,一共有多少种不同的分解方法? 注意交换 3 个…...
二叉搜索树
目录 概念 代码实现 成员 基本结构 查找 插入 删除 中序遍历 拷贝构造 赋值运算符重载 析构函数 递归实现 递归实现查找 递归实现插入 递归实现删除 概念 关于二叉树的基本结构已经进行过详细剖析,本篇博客将对一种特殊的二叉树进行分析。 二叉树&…...
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 他问我能不能登录这个网站,又因为考察php内容,在URL后面添加/index.php,无任何回显 试试/index.phps 分析一下代码,发现要用get方式上传idadmin,…...
笔记本+移动端维修全套教程
今天分享的是笔记本移动端维修全套教程(免费视频资料大全) 当自己手机或者电脑坏了,很多人都会想着去维修店铺修,但价格不透明,容易被坑,当自己了解一些之后,即使不会修,也可以对手…...
【STM32】知识点介绍二:GPIO引脚介绍
文章目录 一、概述二、GPIO的工作模式三、寄存器编程 一、概述 GPIO(英语:General-purpose input/output),即通用I/O(输入/输出)端口,是STM32可控制的引脚。STM32芯片的GPIO引脚与外部设备连接起来,可实现与外部通讯、…...
【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组件布局
实验要求: 制作一个B站视频卡片界面,大致如下图所示,要求应用到线性布局、层叠布局等相关课堂知识。背景图、logo及文本内容不限。 实验环境 :DevEco Studio 实验过程: 步骤1:创建项目 1. 在您的开发环境…...
[MySQL]MySQL数据库基础知识与操作
MySQL基础知识 为什么要有数据库? 文件存储的缺点 1.没有以某种特定的数据格式存储数据,查找不方便,只能遍历2.安全性:数据误操作后不能回滚3.每次操作数据都要用户自己操作4.数据量大的时候,操作的成本很高 创建一…...
卡诺图化简法的原理
引子 若两个最小项只有一个因子不同,则称这两个最小项具有相邻性。 例如, A ′ B C ′ ABC A′BC′和 A B C ABC ABC两个最小项仅第一个因子不同,所以它们具有相邻性。这两个最小项相加时定能合并成一项并将一对不同的因子消去 A ′ B C ′…...
从零开始:使用Luatools工具高效烧录Air780EPM核心板项目的完整指南
本文将深入讲解如何使用Luatools工具烧录一个具体的项目到Air780EPM开发板中。如何使用官方推荐的Luatools工具(一款跨平台、命令行驱动的烧录利器),通过“环境配置→硬件连接→参数设置→一键烧录”四大步骤,帮助用户实现Air780E…...