【C到Java的深度跃迁:从指针到对象,从过程到生态】第四模块·Java特性专精 —— 第十五章 泛型:类型系统的元编程革命
一、从C的void*到Java类型安全
1.1 C泛型的原始实现
C语言通过void*
和宏模拟泛型,存在严重安全隐患:
典型泛型栈实现:
#define DECLARE_STACK(type) \
struct stack_##type { \ type* data; \ int top; \ int capacity; \
}; #define INIT_STACK(s, initial_size) \
do { \ (s)->data = malloc((initial_size) * sizeof(*(s)->data)); \ (s)->top = -1; \ (s)->capacity = initial_size; \
} while(0) DECLARE_STACK(int);
DECLARE_STACK(float); int main() { struct stack_int intStack; INIT_STACK(&intStack, 10); intStack.data[0] = 42; // 正确类型 struct stack_float floatStack; floatStack.data[0] = 3.14f; // 另一个栈
}
内存布局风险:
- 类型混淆可能导致内存破坏
- 无法防止错误的类型赋值
- 代码膨胀(每个类型需生成新结构体)
1.2 Java泛型的类型屏障
Java泛型在编译器构建安全防护:
Stack<Integer> intStack = new Stack<>();
intStack.push(42); // 编译时报错
intStack.push("hello"); // 类型不匹配错误
三维安全矩阵:
维度 | C宏泛型 | Java泛型 |
---|---|---|
类型检查 | 运行时可能崩溃 | 编译时拦截错误 |
代码复用 | 需为每个类型生成代码 | 单份字节码支持所有类型 |
内存安全 | 可能错误写入内存 | 强制类型安全访问 |
1.3 泛型哲学对比
// C哲学:信任程序员
void* malloc(size_t size); // 返回无类型指针 // Java哲学:验证一切
class ArrayList<E> { // 显式类型参数 E[] elementData; // 编译时检查类型
}
二、类型擦除的魔法与代价
2.1 C预处理的启示
C通过文本替换实现"泛型":
#define GENERIC_MAX(type) \
type type##_max(type x, type y) { \ return x > y ? x : y; \
} GENERIC_MAX(int) // 生成int_max函数
GENERIC_MAX(double) // 生成double_max函数
Java的擦除实现:
// 编译前
public class Box<T> { private T value; public void set(T value) { this.value = value; }
} // 编译后(字节码层面)
public class Box { private Object value; public void set(Object value) { ... }
}
擦除过程分解:
- 将类型参数替换为Object
- 在需要时插入强制转换
- 生成桥接方法保持多态性
2.2 擦除带来的限制
无法创建泛型数组:
T[] arr = new T[10]; // 编译错误
C模拟问题:
#define CREATE_ARRAY(type, size) \ (type*)malloc((size)*sizeof(type)) int* intArr = CREATE_ARRAY(int, 10); // 正确
float* floatArr = CREATE_ARRAY(int, 10); // 无声的错误!
Java解决方案:
List<T> list = new ArrayList<>(); // 使用集合代替数组
2.3 类型擦除的二进制证据
反射验证擦除:
List<String> strList = new ArrayList<>();
List<Integer> intList = new ArrayList<>(); System.out.println(strList.getClass() == intList.getClass()); // 输出true
字节码对比:
// 原始代码
List<String> list = new ArrayList<>();
list.add("hello"); // 编译后
aload_1
ldc "hello"
invokeinterface #2 <java/util/List.add> // 无类型信息,等价于添加Object
三、通配符的协变与逆变
3.1 C指针转换的教训
C允许危险的类型转换:
struct Animal { int age; };
struct Cat { struct Animal base; int tail; }; void process_animal(struct Animal* a) { a->age++;
} int main() { struct Cat c = { {3}, 15 }; process_animal((struct Animal*)&c); // 合法但危险
}
Java的解决方案:
List<? extends Animal> animals = new ArrayList<Cat>();
// animals.add(new Cat()); // 编译错误
Animal a = animals.get(0); // 安全读取
3.2 通配符的数学原理
集合协变规则:
如果Cat是Animal的子类
则List<Cat>不是List<Animal>的子类
但List<? extends Animal>可以接受List<Cat>
逆变示例:
Comparator<Animal> animalComparator = ...;
Collections.sort(cats, animalComparator); // Comparator<Animal>可以比较Cat
3.3 通配符实战模式
生产者-消费者模式:
// 生产者使用extends
public void copy(List<? extends Number> src, List<? super Number> dest) { for (Number n : src) { dest.add(n); }
} // 使用示例
List<Integer> ints = Arrays.asList(1,2,3);
List<Object> objs = new ArrayList<>();
copy(ints, objs);
C模拟实现:
void copy(void* src, size_t src_size, void* dest, size_t elem_size, int (*copy_func)(void*, void*)) { // 需要手动管理类型
}
四、泛型性能的终极对决
4.1 类型擦除的性能真相
字节码对比测试:
// 泛型方法
public static <T> T genericMethod(T input) { return input;
} // 原生方法
public static Object rawMethod(Object input) { return input;
}
反编译结果:
// 泛型方法字节码
aload_0
areturn // 原生方法字节码
aload_0
areturn
性能结论:
- 类型擦除不会引入额外运行时开销
- 但自动装箱可能导致性能下降
4.2 与C模板的对比
C++模板代码膨胀:
template<typename T>
T max(T a, T b) { return a > b ? a : b; } // 编译生成两份机器码
int max<int>(int, int);
double max<double>(double, double);
Java泛型优势:
- 单份字节码服务所有类型
- 避免代码膨胀
- 但失去特化优化机会
4.3 基准测试数据
百万次方法调用耗时:
类型 | Java泛型 | Java原生 | C模板 | C void* |
---|---|---|---|---|
整型 | 12ms | 10ms | 8ms | 15ms |
浮点型 | 14ms | 12ms | 9ms | 16ms |
自定义对象 | 18ms | - | 11ms | 25ms |
五、C程序员的转型指南
5.1 思维模式转换矩阵
C模式 | Java泛型方案 | 注意事项 |
---|---|---|
void*通用指针 | 泛型类/方法 | 无需强制转换 |
宏生成类型特定代码 | 单实现服务多类型 | 注意擦除后的类型边界 |
函数指针回调 | 泛型接口 | 结合lambda更简洁 |
内存类型强转 | 通配符边界 | 编译时保障安全 |
联合体多类型存储 | 泛型容器 | 失去内存控制但更安全 |
5.2 典型陷阱与规避
陷阱1:原生类型混用
List rawList = new ArrayList<String>();
rawList.add(42); // 运行时异常!
解决方案:
List<String> safeList = new ArrayList<>();
陷阱2:数组协变误导
Object[] objArr = new String[10];
objArr[0] = 42; // 运行时ArrayStoreException
正确方式:
List<Object> safeList = new ArrayList<String>(); // 编译错误
5.3 高效泛型编程准则
-
优先使用泛型集合
// 错误 List list = new ArrayList(); // 正确 List<String> list = new ArrayList<>();
-
避免不必要的装箱
// 低效 List<Integer> list = new ArrayList<>(); list.add(42); // 自动装箱 // 高效(第三方库) IntList fastList = new IntArrayList(); fastList.add(42);
-
合理使用通配符
// 灵活API设计 public static void shuffle(List<?> list) { // 可以处理任意类型列表 }
六、超越类型擦除
6.1 类型令牌模式
通过Class对象保留类型信息:
class TypeToken<T> { private final Class<T> type; public TypeToken(Class<T> type) { this.type = type; } public Class<T> getType() { return type; }
} // 使用示例
TypeToken<List<String>> token = new TypeToken<>() {};
C模拟实现:
struct TypeInfo { size_t size; const char* name;
}; #define TYPE_TOKEN(type) { sizeof(type), #type } struct TypeInfo intType = TYPE_TOKEN(int);
6.2 注解处理器进阶
在编译时生成类型安全代码:
@AutoFactory
public interface UserFactory<T extends User> { T create(String name);
} // 编译时生成实现类
6.3 Valhalla项目展望
Java未来可能引入值类型:
inline class Point { int x; int y;
} List<Point> points = new ArrayList<>(); // 无装箱开销
转型检查表
C习惯 | Java泛型实践 | 完成度 |
---|---|---|
void*通用容器 | 泛型集合类 | □ |
宏类型生成 | 单泛型实现 | □ |
函数指针多态 | 泛型接口 | □ |
联合体存储多类型 | 泛型容器+继承体系 | □ |
内存类型强制转换 | 通配符边界 | □ |
附录:javac的泛型魔法
编译过程关键步骤:
- 解析类型参数
- 类型检查与推断
- 类型擦除
- 插入强制转换
- 生成桥接方法
反编译验证命令:
javac -parameters GenericsExample.java
javap -c -v GenericsExample.class
下章预告
第十六章 多线程:从pthread到JMM的升维
- synchronized的Monitor锁实现
- volatile的MESI协议解析
- 线程池的Work-Stealing算法
在评论区分享您在使用泛型时遇到的类型擦除难题,我们将挑选典型案例进行深度解析!
相关文章:
【C到Java的深度跃迁:从指针到对象,从过程到生态】第四模块·Java特性专精 —— 第十五章 泛型:类型系统的元编程革命
一、从C的void*到Java类型安全 1.1 C泛型的原始实现 C语言通过void*和宏模拟泛型,存在严重安全隐患: 典型泛型栈实现: #define DECLARE_STACK(type) \ struct stack_##type { \ type* data; \ int top; \ int capacity; \ }; #de…...
纯净无噪,智见未来——MAGI-1本地部署教程,自回归重塑数据本质
一、MAGI-1简介 MAGI-1 是一种逐块生成视频的自回归去噪模型,而非一次性生成完整视频。每个视频块(含 24 帧)通过整体去噪处理,当前块达到特定去噪阈值后,立即启动下一块的生成。这种流水线设计支持 最多 4 个块的并发…...
BG开发者日志0427:故事的起点
1、4月26日晚上,BG项目的gameplay部分开发完毕,后续是细节以及试玩版优化。 开发重心转移到story部分,目前刚开始, 确切地说以前是长期搁置状态,因为过去的四个月中gameplay部分优先开发。 --- 2、BG这个项目的起点…...
直播预告|TinyVue 组件库高级用法:定制你的企业级UI体系
TinyVue 是一个跨端跨框架的企业级 UI 组件库,基于 renderless 无渲染组件设计架构,实现了一套代码同时支持 Vue2 和 Vue3,支持 PC 和移动端,包含 100 多个功能丰富的精美组件,可帮助开发者高效开发 Web 应用。 4 月 …...
基于Jamba模型的天气预测实战
深入探索Mamba模型架构与应用 - 商品搜索 - 京东 DeepSeek大模型高性能核心技术与多模态融合开发 - 商品搜索 - 京东 由于大气运动极为复杂,影响天气的因素较多,而人们认识大气本身运动的能力极为有限,因此以前天气预报水平较低 。预报员在预…...
Customizing Materials Management with SAP ERP Operations
Customizing Materials Management with SAP ERP Operations...
使用 NServiceBus 在 .NET 中构建分布式系统
在 .NET 中,NServiceBus 依然是构建可靠、可扩展、异步消息驱动架构的强大工具。本文将为你讲解如何在 .NET 环境下集成 NServiceBus,帮助你理解其核心概念及配置方法,并快速上手构建基于消息的系统。 一、NServiceBus 简介 NServiceBus …...
【Linux网络与网络编程】13.五种 IO 模型
前言 在前面的学习中,有一个问题一直没有展开来说,即 IO 问题。 IO 到底有多少种方式呢?什么是高效的 IO 呢? IO 本质上就是 INPUT 和 OUTPUT 。在网络中 INPUT 就是从网卡中获取数据,而 OUTPUT 就是向网卡中发送数据…...
Java后端开发day37--源码解析:TreeMap可变参数--集合工具类:Collections
(以下内容全部来自上述课程) 1. TreeMap 1.1 须知 1.1.1 Entry 节点初始为黑色:提高代码阅读性 1.1.2 TreeMap中的成员变量 comparator:比较规则root:红黑树根节点的地址值size:集合的长度和红黑树…...
海关 瑞数 后缀分析 rs
声明 本文章中所有内容仅供学习交流使用,不用于其他任何目的,抓包内容、敏感网址、数据接口等均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关! 逆向过程 部分python代码 cp execj…...
【合新通信】---Mini单路光模块(Mini SFF/USOT)
产品特性 l 高可靠、全金属外壳、抗振动设计 l 紧凑的结构设计, 超小模块尺寸 l 可插拔标准LC单模光纤连接器接口,方便动态和灵活的配置数据连接 l 每通道工作速率可达1.25Gbps,速率可向下兼容 l 单路发射光纤通道,内置1310nm波长光发射…...
Java详解LeetCode 热题 100(02):LeetCode 49. 字母异位词分组(Group Anagrams)详解
文章目录 1. 题目描述2. 理解题目3. 解法一:排序法3.1 思路3.2 Java代码实现3.3 代码详解3.4 复杂度分析3.5 适用场景4. 解法二:计数法4.1 思路4.2 Java代码实现4.3 代码详解4.4 复杂度分析4.5 适用场景5. 解法三:字符串哈希法5.1 思路5.2 Java代码实现5.3 代码详解5.4 复杂…...
【每日随笔】文化属性 ① ( 天机 | 强势文化与弱势文化 | 文化属性的形成与改变 | 强势文化 具备的特点 )
文章目录 一、文化属性1、天机2、文化属性的强势文化与弱势文化强势文化弱势文化 二、文化属性的形成与改变1、文化属性形成2、文化属性改变3、文化知识的阶层 三、强势文化 具备的 特点 一、文化属性 1、天机 如果想要 了解这个世界的 底层架构 , 就需要掌握 洞察事物本质 的能…...
Java + Seleium4.X + TestNG自动化技术
系列文章目录 文章目录 系列文章目录前言一、 Java版Selenium自动化测试框架介绍和原理1.1 什么是Seleium1.2 特点1.3 注意点 二、安装SeleiumChrome环境 创建Maven项目2.1 安装Seleium Chrome环境2.2 Maven环境 三、Selenium4.X UI元素定位实战3.1 ID选择器3.2 Name选择器3.…...
Spark SQL核心概念与编程实战:从DataFrame到DataSet的结构化数据处理
一、Spark-SQL是什么 Spark SQL 是 Spark 用于结构化数据(structured data)处理的 Spark 模块。 二、Hive and SparkSQL SparkSQL 的前身是 Shark,Shark是给熟悉 RDBMS 但又不理解 MapReduce 的技术人员提供的快速上手的工具。 Hive 是早期唯一运行在 Hadoop 上的 S…...
electron-vite 应用打包自定义图标不显示问题
// 修改electron-builder.yml ... win:executableName: xxx //可执行文件名称icon: build/icon.ico //你的图标路径 ...打包后,自定义图标不显示原因: 1 cannot execute causeexit status 2,安装包无法生成 用管理员身份运行,win11右击开始…...
AI中Token的理解与使用总结
AI中Token的理解与使用总结 什么是Token 在AI领域,特别是自然语言处理(NLP)中,Token是指将文本分割成的最小处理单元。Tokenization(分词)是将原始文本分解为Token的过程。 Token的几种形式 单词级Token:以单词为基本单位 示例:“Hello world” → [“Hello”, “world”…...
C++/SDL 进阶游戏开发 —— 双人塔防(代号:村庄保卫战 14)
🎁个人主页:工藤新一 🔍系列专栏:C面向对象(类和对象篇) 🌟心中的天空之城,终会照亮我前方的路 🎉欢迎大家点赞👍评论📝收藏⭐文章 文章目录 二…...
全栈量子跃迁:当Shor算法破解RSA时,我们如何用晶格密码重构数字世界的信任基岩?
一、量子威胁的降维打击 1. Shor算法的毁灭性力量 # Shor算法量子电路简化示例(Qiskit实现) from qiskit import QuantumCircuit from qiskit.circuit.library import QFTdef shor_circuit(n: int, a: int) -> QuantumCircuit:qc QuantumCircuit(2…...
python实战项目65:drissionpage采集boss直聘数据
python实战项目65:drissionpage采集boss直聘数据 一、需求简介二、流程分析三、完整代码一、需求简介 boss直聘网站近期改版,改版之后代码需要做相应的升级维护。drissionpage采集网页数据是一种不错的方式,笔者认为比Selenium好用,使用方法大家可以自行查阅资料。boss直聘…...
常用的性能提升手段--提纲
上一篇文章里,介绍了提升性能的一种优化手段:池化。 这篇文章来归纳整理一下其他的常见的提升性能的手段 1. 缓存 (Caching) 缓存可以说是计算机领域的万金油了,它无处不在。 举个最简单的例子,CPU -> L1,L2,L3 Cache -> 内存 。 CPU的处理速度要比内存快几个数量…...
天梯——现代战争
第一次做的时候,直接暴力,显然最后超时。 暴力代码如下: #include<bits/stdc.h> using namespace std; const int N10005; bool mark1[N]{0},mark2[N]{0}; int p[N][N]; int main(){int n,m,k,a,b;cin>>n>>m>>k;fo…...
Codeforces Round 1021 (Div. 2) D. Baggage Claim(建图)
每周五篇博客:(4/5) https://codeforces.com/contest/2098/problem/D 题意 每个机场都有一个行李索赔区,巴尔贝索沃机场也不例外。在某个时候,Sheremetyevo的一位管理员提出了一个不寻常的想法:将行李索…...
常用第三方库:shared_preferences数据持久化
常用第三方库:shared_preferences数据持久化 前言 shared_preferences是Flutter中最常用的轻量级数据持久化解决方案,它提供了一个简单的key-value存储机制,适合存储用户配置、应用设置等小型数据。本文将从实战角度深入讲解shared_prefere…...
项目驱动 CAN-bus现场总线基础教程》随笔
阅读:《项目驱动 CAN-bus现场总线基础教程》 仲裁段的实现 有感而发 感觉出人意外之处 感觉出人意外之处 最近在阅读入门的CAN相关书籍时,在介绍仲裁段是如何实现各节点之间,通讯仲裁功能的章节中,有如下一段描述: …...
WPF之XAML基础
文章目录 XAML基础:深入理解WPF和UWP应用开发的核心语言1. XAML简介XAML与XML的关系 2. XAML语法基础元素语法属性语法集合语法附加属性 3. XAML命名空间命名空间映射关系 4. XAML标记扩展静态资源引用数据绑定相对资源引用常见标记扩展对比 5. XAML与代码的关系XAM…...
测试基础笔记第十四天
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 一、字符串1.字符串2.字符串切片3.查找find()4.去除两端空白字符 strip5.字符串转换大小写 lower、upper5.拆分 split()6.字符串的其他常见方…...
Java详解LeetCode 热题 100(01):LeetCode 1. 两数之和(Two Sum)详解
文章目录 1. 题目描述2. 理解题目3. 解法一:暴力枚举法3.1 思路3.2 Java代码实现3.3 代码详解3.4 复杂度分析3.5 适用场景 4. 解法二:哈希表法4.1 思路4.2 Java代码实现4.3 代码详解4.4 复杂度分析4.5 适用场景 5. 解法三:两遍哈希表法5.1 思…...
机器学习之三:归纳学习
正如人们有各种各样的学习方法一样,机器学习也有多种学习方法。若按学习时所用的方法进行分类,则机器学习可分为机械式学习、指导式学习、示例学习、类比学习、解释学习等。这是温斯顿在1977年提出的一种分类方法。 有关机器学习的基本概念,…...
AI声像融合守护幼儿安全——打骂/异常声音报警系统的智慧防护
幼儿园是孩子们快乐成长的摇篮,但打骂、哭闹或尖叫等异常事件可能打破这份宁静,威胁幼儿的身心安全。打骂/异常声音报警系统,依托尖端的AI声像融合技术,结合语音识别、情绪分析与视频行为检测,为幼儿园筑起一道智能安全…...
2024ICPC网络赛第二场题解
文章目录 F. Tourist(签到)I. Strange Binary(思维)J. Stacking of Goods(思维)A. Gambling on Choosing Regionals(签到)G. Game(数学)L. 502 Bad Gateway(数学)E. Escape(BFS)C. Prefix of Suffixes(kmp结论)K. match(01trie分治多项式乘法组合数) 题目链接 F. Tourist(签到…...
风控策略引擎架构设计全解析:构建智能实时决策系统
摘要 本文深入探讨现代风控策略引擎的核心架构设计,结合金融反欺诈、电商交易风控等典型场景,详细解析实时决策、规则引擎、特征计算等关键技术模块的实现方案。通过分层架构设计、分布式计算优化、策略动态编排等创新方法,展示如何构建支撑每秒万级决策的高可用风控系统。…...
TensorFlow 安装全攻略
选择 TensorFlow 的原因: TensorFlow 是一个端到端平台,它提供多个抽象级别,因此您可以根据自己的需求选择合适的级别。您可以使用高阶 Keras API 构建和训练模型,该 API 让您能够轻松地开始使用 TensorFlow 和机器学习。如果您需…...
Dijkstra 算法代码步骤[leetcode.743网络延迟时间]
有 n 个网络节点,标记为 1 到 n。 给你一个列表 times,表示信号经过 有向 边的传递时间。 times[i] (ui, vi, wi),其中 ui 是源节点,vi 是目标节点, wi 是一个信号从源节点传递到目标节点的时间。 现在,…...
Ubuntu22.04/24.04 P104-100 安装驱动和 CUDA Toolkit
硬件环境 使用一块技嘉 B85m-DS3H 安装 P104-100, CPU是带集成显卡的i5-4690. 先在BIOS中设置好显示设备优先使用集成显卡(IGX). 然后安装P104-100开机. 登入Ubuntu 后查看硬件信息, 检查P104-100是否已经被检测到 # PCI设备 lspci -v | grep -i nvidia lspci | grep NVIDIA …...
Golang 学习指南
目录 变量与常量数据类型与控制结构常用数据结构函数与错误处理指针与并发Gin 框架与 go mod小结与参考资料 1. 变量与常量 变量(var) 用于定义可变的值。可以指定类型,也可以自动推断类型。示例:var name string "Golang…...
Ubuntu 磁盘空间占用清理(宝塔)
目录 前言1. 基本知识2. 实战 前言 🤟 找工作,来万码优才:👉 #小程序://万码优才/r6rqmzDaXpYkJZF 爬虫神器,无代码爬取,就来:bright.cn 本身自搭建了一个宝塔,突然一下子多了好些空…...
AntBio: 2025 AACR Meeting - Charting New Oncology Frontiers Together
AntBio cordially invites you to attend the 2025 AACR Annual Meeting and jointly chart a new course in oncology research! The global benchmark for cancer research and therapeutics—the 2025 American Association for Cancer Research (AACR) Annual Meeting—wi…...
数模学习:二,MATLAB的基本语法使用
注释代码: (1)在每行语句后面加上分号,则不显示该行代码的运算结果。 在每行代码前加%,则该行代码会被注释掉 (2) 多行注释: 选中要注释的多行语句,按快捷键Ctrl R (3) 取消注释: 选中要注释的多行语句…...
【Webpack \ Vite】多环境配置
环境变量脚本命令 如何通过不同的环境变量或不同的配置文件进行项目区分,动态加载配置。通常,使用环境变量是最简单且灵活的方法,因为它不需要改变构建命令或创建多个配置文件 环境变量 在根目录下创建 .env.xxx 文件,为不同的环…...
已知漏洞打补丁
. 打补丁 根据MS漏洞编号或者CVE漏洞编号都可以找到对应的HotfixID。 1.根据MS漏洞编号可以使用:https://learn.microsoft.com/zh-cn/security-updates/securitybulletins/securitybulletins 即可找到KB编号。 2.根据CVE漏洞编号可以使用:https://cve…...
WGS84(GPS)、火星坐标系(GCJ02)、百度地图(BD09)坐标系转换Java代码
在做基于百度地图、高德地图等电子地图做为地图服务的二次开发时,通常需要将具有WGS84等坐标的矢量数据(如行政区划、地名、河流、道路等GIS地理空间数据)添加到地图上面。 然而,在线地图大多使用的是火星坐标系,需要…...
R语言操作n
1.加载安装vegan包 2.查看data(varechem)和data(varespec),探索其维度和结构 3.基于varespec构建物种互作网络,输出gml文件并采用gephi可视化为图片,输出pdf,阈值为r>0.6,p<0.05 4.基于varespec和varechem构建物种-环境互作…...
ChatGPT与DeepSeek在科研论文撰写中的整体科研流程与案例解析
随着人工智能技术的快速发展,大语言模型如ChatGPT和DeepSeek在科研领域展现出强大的潜力,尤其是在论文撰写方面。本文旨在介绍如何利用ChatGPT和DeepSeek提升科研论文撰写的效率与质量,并提供一个具体案例,详细阐述其技术流程及公…...
VScode在 Markdown 编辑器中预览
1. 使用在线 Mermaid 编辑器 步骤: 打开 Mermaid Live Editor。将你 .md 文件中的 Mermaid 代码(从 mermaid 到结束的代码块)复制粘贴到编辑器的左侧输入框。编辑器会自动在右侧生成可视化的 ER 图。你可以点击右上角的下载按钮,…...
驱动开发硬核特训 · Day 22(下篇): # 深入理解 Power-domain 框架:概念、功能与完整代码剖析
一、Power-domain 框架基础概念 ✏️ 什么是 Power-domain? 在 Linux 内核中,Power-domain(电源域) 是指一组硬件模块的逻辑集合,这些模块可以被统一控制电源状态(上电、断电)。 Linux 内核通…...
无人机超声波避障技术要点与难点!
一、超声波避障技术要点 4. 障碍物建模 通过最小二乘法平面拟合,将单点测距数据转化为障碍物表面模型,提高避障准确性。 使用队列(wallqueue)存储障碍物信息,并进行去重处理,避免重复避障。 5. 避障轨…...
ASCII字符编码标准及字符表
目录 概述 1 标准 ASCII 表(0-127) 2 大写字母(A-Z) 3 小写字母(a-z) 4 说明 概述 ASCII(American Standard Code for Information Interchange,美国信息交换标准代码ÿ…...
联想昭阳笔记本 风扇一键静音优化操作指南
【联想昭阳笔记本 一键静音优化操作指南】 第1步:安装官方工具 Lenovo Vantage 打开【开始菜单】→ 搜索【Microsoft Store】,打开。在 Store 里搜索【Lenovo Vantage】,下载安装。安装好后,打开【Lenovo Vantage】。进入【设备…...
go语言八股文(三)
1.java和go的区别 1. 语言设计目标 Java: 通用性:设计为一种通用的、面向对象的编程语言,适用于多种应用场景,如桌面应用、服务器端应用、移动应用等。跨平台性:通过“一次编写,到处运行”(Wr…...