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

HarmonyOS 应用开发之非线性容器

非线性容器实现能快速查找的数据结构,其底层通过hash或者红黑树实现,包括HashMap、HashSet、TreeMap、TreeSet、LightWeightMap、LightWeightSet、PlainArray七种。非线性容器中的key及value的类型均满足ECMA标准。

HashMap

HashMap 可用来存储具有关联关系的key-value键值对集合,存储元素中key是唯一的,每个key会对应一个value值。

HashMap依据泛型定义,集合中通过key的hash值确定其存储位置,从而快速找到键值对。HashMap的初始容量大小为16,并支持动态扩容,每次扩容大小为原始容量的2倍。HashMap底层基于HashTable实现,冲突策略采用链地址法。

HashMap和 TreeMap 相比,HashMap依据键的hashCode存取数据,访问速度较快。而TreeMap是有序存取,效率较低。

HashSet 基于HashMap实现。HashMap的输入参数由key、value两个值组成。在HashSet中,只对value对象进行处理。

需要快速存取、删除以及插入键值对数据时,推荐使用HashMap。

HashMap进行增、删、改、查操作的常用API如下:

操作描述
增加元素通过set(key: K, value: V)函数每次在HashMap增加一个键值对。
访问元素通过get(key: K)获取key对应的value值。
访问元素通过keys()返回一个迭代器对象,包含map中的所有key值。
访问元素通过values()返回一个迭代器对象,包含map中的所有value值。
访问元素通过entries()返回一个迭代器对象,包含map中的所有键值对。
访问元素forEach(callbackFn: (value?: V, key?: K, map?: HashMap<K, V>) => void, thisArg?: Object)访问整个map的元素。
访问元素通过[Symbol.iterator]():IterableIterator<[K,V]>迭代器进行数据访问。
修改元素通过replace(key: K, newValue: V)对指定key对应的value值进行修改操作。
修改元素通过forEach(callbackFn: (value?: V, key?: K, map?: HashMap<K, V>) => void, thisArg?: Object)对map中元素进行修改操作。
删除元素通过remove(key: K)对map中匹配到的键值对进行删除操作。
删除元素通过clear()清空整个map集合。

HashSet

HashSet 可用来存储一系列值的集合,存储元素中value是唯一的。

HashSet依据泛型定义,集合中通过value的hash值确定其存储位置,从而快速找到该值。HashSet初始容量大小为16,支持动态扩容,每次扩容大小为原始容量的2倍。value的类型满足ECMA标准中要求的类型。HashSet底层数据结构基于HashTable实现,冲突策略采用链地址法。

HashSet基于 HashMap 实现。在HashSet中,只对value对象进行处理。

HashSet和 TreeSet 相比,HashSet中的数据无序存放,即存放元素的顺序和取出的顺序不一致,而TreeSet是有序存放。它们集合中的元素都不允许重复,但HashSet允许放入null值,TreeSet不建议存放null值,可能会对排序结果产生影响。

可以利用HashSet不重复的特性,当需要不重复的集合或需要去重某个集合的时候使用。

HashSet进行增、删、改、查操作的常用API如下:

操作描述
增加元素通过add(value: T)函数每次在HashSet增加一个值。
访问元素通过values()返回一个迭代器对象,包含set中的所有value值。
访问元素通过entries()返回一个迭代器对象,包含类似键值对的数组,键值都是value。
访问元素通过forEach(callbackFn: (value?: T, key?: T, set?: HashSet<T>) => void, thisArg?: Object)访问整个set的元素。
访问元素通过[Symbol.iterator]():IterableIterator<T>迭代器进行数据访问。
修改元素通过forEach(callbackFn: (value?: T, key?: T, set?: HashSet<T>) => void, thisArg?: Object)对set中value进行修改操作。
删除元素通过remove(value: T)对set中匹配到的值进行删除操作。
删除元素通过clear()清空整个set集合。

TreeMap

TreeMap 可用来存储具有关联关系的key-value键值对集合,存储元素中key是唯一的,每个key会对应一个value值。

TreeMap依据泛型定义,集合中的key值是有序的,TreeMap的底层是一棵二叉树,可以通过树的二叉查找快速的找到键值对。key的类型满足ECMA标准中要求的类型。TreeMap中的键值是有序存储的。TreeMap底层基于红黑树实现,可以进行快速的插入和删除。

TreeMap和 HashMap 相比,HashMap依据键的hashCode存取数据,访问速度较快。而TreeMap是有序存取,效率较低。

一般需要存储有序键值对的场景,可以使用TreeMap。

TreeMap进行增、删、改、查操作的常用API如下:

操作描述
增加元素通过set(key: K,value: V)函数每次在TreeMap增加一个键值对。
访问元素通过get(key: K)获取key对应的value值。
访问元素通过getFirstKey()获取map中排在首位的key值。
访问元素通过getLastKey()获取map中排在未位的key值。
访问元素通过keys()返回一个迭代器对象,包含map中的所有key值。
访问元素通过values()返回一个迭代器对象,包含map中的所有value值。
访问元素通过entries()返回一个迭代器对象,包含map中的所有键值对。
访问元素通过forEach(callbackFn: (value?: V, key?: K, map?: TreeMap<K, V>) => void, thisArg?: Object)访问整个map的元素。
访问元素通过[Symbol.iterator]():IterableIterator<[K,V]>迭代器进行数据访问。
修改元素通过replace(key: K,newValue: V)对指定key对应的value值进行修改操作。
修改元素通过forEach(callbackFn: (value?: V, key?: K, map?: TreeMap<K, V>) => void, thisArg?: Object)对map中元素进行修改操作。
删除元素通过remove(key: K)对map中匹配到的键值对进行删除操作。
删除元素通过clear()清空整个map集合。

TreeSet

TreeSet 可用来存储一系列值的集合,存储元素中value是唯一的。

TreeSet依据泛型定义,集合中的value值是有序的,TreeSet的底层是一棵二叉树,可以通过树的二叉查找快速的找到该value值,value的类型满足ECMA标准中要求的类型。TreeSet中的值是有序存储的。TreeSet底层基于红黑树实现,可以进行快速的插入和删除。

TreeSet基于 TreeMap 实现,在TreeSet中,只对value对象进行处理。TreeSet可用于存储一系列值的集合,元素中value唯一且有序。

TreeSet和 HashSet 相比,HashSet中的数据无序存放,而TreeSet是有序存放。它们集合中的元素都不允许重复,但HashSet允许放入null值,TreeSet不建议存放null值,可能会对排序结果产生影响。

一般需要存储有序集合的场景,可以使用TreeSet。

TreeSet进行增、删、改、查操作的常用API如下:

操作描述
增加元素通过add(value: T)函数每次在TreeSet增加一个值。
访问元素通过values()返回一个迭代器对象,包含set中的所有value值。
访问元素通过entries()返回一个迭代器对象,包含类似键值对的数组,键值都是value。
访问元素通过getFirstValue()获取set中排在首位的value值。
访问元素通过getLastValue()获取set中排在未位的value值。
访问元素通过forEach(callbackFn: (value?: T, key?: T, set?: TreeSet<T>) => void, thisArg?: Object)访问整个set的元素。
访问元素通过[Symbol.iterator]():IterableIterator<T>迭代器进行数据访问。
修改元素通过forEach(callbackFn: (value?: T, key?: T, set?: TreeSet<T>) => void, thisArg?: Object)对set中value进行修改操作。
删除元素通过remove(value: T)对set中匹配到的值进行删除操作。
删除元素通过clear()清空整个set集合。

LightWeightMap

LightWeightMap 可用来存储具有关联关系的key-value键值对集合,存储元素中key是唯一的,每个key会对应一个value值。LightWeightMap依据泛型定义,采用更加轻量级的结构,底层标识唯一key通过hash实现,其冲突策略为线性探测法。集合中的key值的查找依赖于hash值以及二分查找算法,通过一个数组存储hash值,然后映射到其他数组中的key值以及value值,key的类型满足ECMA标准中要求的类型。

初始默认容量大小为8,每次扩容大小为原始容量的2倍。

LightWeightMap和 HashMap 都是用来存储键值对的集合,LightWeightMap占用内存更小。

当需要存取key-value键值对时,推荐使用占用内存更小的LightWeightMap。

LightWeightMap进行增、删、改、查操作的常用API如下:

操作描述
增加元素通过set(key: K,value: V)函数每次在LightWeightMap增加一个键值对。
访问元素通过get(key: K)获取key对应的value值。
访问元素通过getIndexOfKey(key: K)获取map中指定key的index。
访问元素通过getIndexOfValue(value: V)获取map中指定value出现的第一个的index。
访问元素通过keys()返回一个迭代器对象,包含map中的所有key值。
访问元素通过values()返回一个迭代器对象,包含map中的所有value值。
访问元素通过entries()返回一个迭代器对象,包含map中的所有键值对。
访问元素通过getKeyAt(index: number)获取指定index对应的key值。
访问元素通过getValueAt(index: number)获取指定index对应的value值。
访问元素通过forEach(callbackFn: (value?: V, key?: K, map?: LightWeightMap<K, V>) => void, thisArg?: Object)访问整个map的元素。
访问元素通过[Symbol.iterator]():IterableIterator<[K,V]>迭代器进行数据访问。
修改元素通过setValueAt(index: number, newValue: V)对指定index对应的value值进行修改操作。
修改元素通过forEach(callbackFn: (value?: V, key?: K, map?: LightWeightMap<K, V>) => void, thisArg?: Object)对map中元素进行修改操作。
删除元素通过remove(key: K)对map中匹配到的键值对进行删除操作。
删除元素通过removeAt(index: number)对map中指定index的位置进行删除操作。
删除元素通过clear()清空整个map集合。

LightWeightSet

LightWeightSet 可用来存储一系列值的集合,存储元素中value是唯一的。

LightWeightSet依据泛型定义,采用更加轻量级的结构,初始默认容量大小为8,每次扩容大小为原始容量的2倍。集合中的value值的查找依赖于hash以及二分查找算法,通过一个数组存储hash值,然后映射到其他数组中的value值,value的类型满足ECMA标准中要求的类型。

LightWeightSet底层标识唯一value基于hash实现,其冲突策略为线性探测法,查找策略基于二分查找法。

LightWeightSet和 HashSet 都是用来存储键值的集合,LightWeightSet的占用内存更小。

当需要存取某个集合或是对某个集合去重时,推荐使用占用内存更小的LightWeightSet。

LightWeightSet进行增、删、改、查操作的常用API如下:

操作描述
增加元素通过add(obj: T)函数每次在LightWeightSet增加一个值。
访问元素通过getIndexOf(key: T)获取对应的index值。
访问元素通过values()返回一个迭代器对象,包含map中的所有value值。
访问元素通过entries()返回一个迭代器对象,包含map中的所有键值对。
访问元素通过getValueAt(index: number)获取指定index对应的value值。
访问元素通过forEach(callbackFn: (value?: T, key?: T, set?: LightWeightSet<T>) => void, thisArg?: Object)访问整个set的元素。
访问元素通过[Symbol.iterator]():IterableIterator<T>迭代器进行数据访问。
修改元素通过forEach(callbackFn: (value?: T, key?: T, set?: LightWeightSet<T>) => void, thisArg?: Object)对set中元素进行修改操作。
删除元素通过remove(key: K)对set中匹配到的键值对进行删除操作。
删除元素通过removeAt(index: number)对set中指定index的位置进行删除操作。
删除元素通过clear()清空整个set集合。

PlainArray

PlainArray 可用来存储具有关联关系的键值对集合,存储元素中key是唯一的,并且对于PlainArray来说,其key的类型为number类型。每个key会对应一个value值,类型依据泛型的定义,PlainArray采用更加轻量级的结构,集合中的key值的查找依赖于二分查找算法,然后映射到其他数组中的value值。

初始默认容量大小为16,每次扩容大小为原始容量的2倍。

PlainArray和 LightWeightMap 都是用来存储键值对,且均采用轻量级结构,但PlainArray的key值类型只能为number类型。

当需要存储key值为number类型的键值对时,可以使用PlainArray。

PlainArray进行增、删、改、查操作的常用API如下:

操作描述
增加元素通过add(key: number,value: T)函数每次在PlainArray增加一个键值对。
访问元素通过get(key: number)获取key对应的value值。
访问元素通过getIndexOfKey(key: number)获取PlainArray中指定key的index。
访问元素通过getIndexOfValue(value: T)获取PlainArray中指定value的index。
访问元素通过getKeyAt(index: number)获取指定index对应的key值。
访问元素通过getValueAt(index: number)获取指定index对应的value值。
访问元素通过forEach(callbackFn: (value: T, index?: number, PlainArray?: PlainArray<T>) => void, thisArg?: Object)访问整个plainarray的元素。
访问元素通过[Symbol.iterator]():IterableIterator<[number, T]>迭代器进行数据访问。
修改元素通过setValueAt(index:number, value: T)对指定index对应的value值进行修改操作。
修改元素通过forEach(callbackFn: (value: T, index?: number, PlainArray?: PlainArray<T>) => void, thisArg?: Object)对plainarray中元素进行修改操作。
删除元素通过remove(key: number)对plainarray中匹配到的键值对进行删除操作。
删除元素通过removeAt(index: number)对plainarray中指定index的位置进行删除操作。
删除元素通过removeRangeFrom(index: number, size: number)对plainarray中指定范围内的元素进行删除操作。
删除元素通过clear()清空整个PlainArray集合。

非线性容器的使用

此处列举常用的非线性容器HashMap、TreeMap、LightWeightMap、PlainArray的使用示例,包括导入模块、增加元素、访问元素及修改等操作,示例代码如下所示:

// HashMap
import HashMap from '@ohos.util.HashMap'; // 导入HashMap模块let hashMap1: HashMap<string, number> = new HashMap();
hashMap1.set('a', 123);
let hashMap2: HashMap<number, number> = new HashMap();
hashMap2.set(4, 123); // 增加元素
console.info(`result: ${hashMap2.hasKey(4)}`); // 判断是否含有某元素
console.info(`result: ${hashMap1.get('a')}`); // 访问元素// TreeMap
import TreeMap from '@ohos.util.TreeMap'; // 导入TreeMap模块let treeMap: TreeMap<string, number> = new TreeMap();
treeMap.set('a', 123);
treeMap.set('6', 356); // 增加元素
console.info(`result: ${treeMap.get('a')}`); // 访问元素
console.info(`result: ${treeMap.getFirstKey()}`); // 访问首元素
console.info(`result: ${treeMap.getLastKey()}`); // 访问尾元素// LightWeightMap
import LightWeightMap from '@ohos.util.LightWeightMap'; // 导入LightWeightMap模块let lightWeightMap: LightWeightMap<string, number> = new LightWeightMap();
lightWeightMap.set('x', 123);
lightWeightMap.set('8', 356); // 增加元素
console.info(`result: ${lightWeightMap.get('a')}`); // 访问元素
console.info(`result: ${lightWeightMap.get('x')}`); // 访问元素
console.info(`result: ${lightWeightMap.getIndexOfKey('8')}`); // 访问元素// PlainArray
import PlainArray from '@ohos.util.PlainArray' // 导入PlainArray模块let plainArray: PlainArray<string> = new PlainArray();
plainArray.add(1, 'sdd');
plainArray.add(2, 'sff'); // 增加元素
console.info(`result: ${plainArray.get(1)}`); // 访问元素
console.info(`result: ${plainArray.getKeyAt(1)}`); // 访问元素

为了能让大家更好的学习鸿蒙(HarmonyOS NEXT)开发技术,这边特意整理了《鸿蒙开发学习手册》(共计890页),希望对大家有所帮助:https://qr21.cn/FV7h05

《鸿蒙开发学习手册》:

如何快速入门:https://qr21.cn/FV7h05

  1. 基本概念
  2. 构建第一个ArkTS应用
  3. ……

开发基础知识:https://qr21.cn/FV7h05

  1. 应用基础知识
  2. 配置文件
  3. 应用数据管理
  4. 应用安全管理
  5. 应用隐私保护
  6. 三方应用调用管控机制
  7. 资源分类与访问
  8. 学习ArkTS语言
  9. ……

基于ArkTS 开发:https://qr21.cn/FV7h05

  1. Ability开发
  2. UI开发
  3. 公共事件与通知
  4. 窗口管理
  5. 媒体
  6. 安全
  7. 网络与链接
  8. 电话服务
  9. 数据管理
  10. 后台任务(Background Task)管理
  11. 设备管理
  12. 设备使用信息统计
  13. DFX
  14. 国际化开发
  15. 折叠屏系列
  16. ……

鸿蒙开发面试真题(含参考答案):https://qr18.cn/F781PH

鸿蒙开发面试大盘集篇(共计319页):https://qr18.cn/F781PH

1.项目开发必备面试题
2.性能优化方向
3.架构方向
4.鸿蒙开发系统底层方向
5.鸿蒙音视频开发方向
6.鸿蒙车载开发方向
7.鸿蒙南向开发方向

相关文章:

HarmonyOS 应用开发之非线性容器

非线性容器实现能快速查找的数据结构&#xff0c;其底层通过hash或者红黑树实现&#xff0c;包括HashMap、HashSet、TreeMap、TreeSet、LightWeightMap、LightWeightSet、PlainArray七种。非线性容器中的key及value的类型均满足ECMA标准。 HashMap HashMap 可用来存储具有关联…...

Golang Context是什么

一、这篇文章我们简要讨论Golang的Context有什么用 1、首先说一下Context的基本作用&#xff0c;然后在讨论他的实现 (1)数据传递&#xff0c;子Context只能看到自己的和父Context的数据&#xff0c;子Context是不能看到孙Context添加的数据。 (2)父子协程的协同&#xff0c;比…...

算法基础--递推

&#x1f600;前言 递推算法在计算机科学中扮演着重要的角色。通过递推&#xff0c;我们可以根据已知的初始条件&#xff0c;通过一定的规则推导出后续的结果&#xff0c;从而解决各种实际问题。本文将介绍递推算法的基础知识&#xff0c;并通过一些入门例题来帮助读者更好地理…...

超市销售数据-python数据分析项目

Python数据分析项目-基于Python的销售数据分析项目 文章目录 Python数据分析项目-基于Python的销售数据分析项目项目介绍数据分析结果导出数据查阅 数据分析内容哪些类别比较畅销?哪些商品比较畅销?不同门店的销售额占比哪个时间段是超市的客流高封期?查看源数据类型计算本月…...

java实现手机号,密码,游邮箱 , 验证码的正则匹配工具类

先定义一个抽象类RegexPatterns&#xff0c;定义相关正则字符串 : public abstract class RegexPatterns {/*** 手机号正则*/public static final String PHONE_REGEX "^1([38][0-9]|4[579]|5[0-3,5-9]|6[6]|7[0135678]|9[89])\\d{8}$";/*** 邮箱正则*/public stat…...

java中的Arrays类的常用操作

Arrays类位于 java.util 包中&#xff0c;主要包含了操作数组的各种方法。 import java.util.Arrays; Arrays.sort(arr); int index Arrays.binarySearch(arr, 3); boolean isEqual Arrays.equals(arr1, arr2); // isEqual为true int[] arrnew int[5]; Arrays.fill(arr, 7)…...

回溯算法|78.子集

力扣题目链接 class Solution { private:vector<vector<int>> result;vector<int> path;void backtracking(vector<int>& nums, int startIndex) {result.push_back(path); // 收集子集&#xff0c;要放在终止添加的上面&#xff0c;否则会漏掉自…...

VC++、GCC、CLANG,INT128有符号整数编译器关键字

注意INT128为目标平台扩展关键字&#xff0c;不属于C/C语言本身支持特性&#xff0c;每个C/C编译器平台支持上都略有不同&#xff0c;甚至不支持。 可以详细参考本人此篇文章&#xff1a; GUN C/C (GCC/CLANG) 对于 __int128_t &#xff08;128位有符号大整数的扩展支持平台限…...

用于HUD平视显示器的控制芯片:S2D13V40

一款利用汽车抬头显示技术用于HUD平视显示器的控制芯片:S2D13V40。HUD的全称是Head Up Display&#xff0c;即平视显示器&#xff0c;以前应用于军用飞机上&#xff0c;旨在降低飞行员需要低头查看仪表的频率。起初&#xff0c;HUD通过光学原理&#xff0c;将驾驶相关的信息投射…...

JSP使用模板字符串数据不能渲染的问题

entrap father 的 rubbish JSP 数据不能直接渲染,要从接口请求后去拼接结构 然后模板字符串不能直接用 用以下方法是不能渲染出数据的 let div <div class"circulation"><div class"list"><div class"left"><div class&qu…...

AI音乐GPT时刻来临:Suno 快速入门手册!

✨✨ 欢迎大家来访Srlua的博文&#xff08;づ&#xffe3;3&#xffe3;&#xff09;づ╭❤&#xff5e;✨✨ &#x1f31f;&#x1f31f; 欢迎各位亲爱的读者&#xff0c;感谢你们抽出宝贵的时间来阅读我的文章。 我是Srlua小谢&#xff0c;在这里我会分享我的知识和经验。&am…...

数字乡村发展蓝图:科技赋能农村实现全面振兴

目录 一、数字乡村发展蓝图的内涵与目标 二、科技赋能农村&#xff1a;数字乡村发展的动力与路径 &#xff08;一&#xff09;加强农业科技创新&#xff0c;提升农业生产效率 &#xff08;二&#xff09;推进农村电商发展&#xff0c;拓宽农民增收渠道 &#xff08;三&…...

Day42 动态规划 part04

Day42 动态规划 part04 46. 携带研究材料(卡哥的卡码网的题目) 背包问题 我的思路: 写不了一点儿…T^T 总结规律就是&#xff0c;dp数组要比原来各个size 1&#xff0c;dp[i][j] Math.max(xxx, xxxx&#xff08;根据题目情况进行各种处理&#xff09;) 解答&#xff1a; …...

python set是什么类型

python set是一种数据类型&#xff0c;数学里的集合概念&#xff0c;在Python语言里对应的是set类型。与list&#xff0c;tuple不同的地方是&#xff0c;set更加强调的是一种“从属关系”&#xff08;membership&#xff09;&#xff0c;跟顺序无关&#xff0c;所以有重复的元素…...

redis事务(redis features)

redis支持事务&#xff0c;也就是可以在一次请求中执行多个命令。redis中的事务主要是通过MULTI和EXEC这两个命令来实现的。 MULTI命令用来开启一个事务&#xff0c;事务开启之后&#xff0c;所有的命令就都会被放入到一个队列中&#xff0c;最后通过一个EXEC命令来执行事务中…...

SpringBoot整合minio

SpringBoot整合minio 1. 下载及安装1.1 windows版本1.2 Linux版本 2. SpringBoot整合minio2.1 依赖2.2 配置文件2.3 配置类2.4 工具类2.5 测试1. 业务层2. 控制层 1. 下载及安装 1.1 windows版本 目录结构 启动文件 标红的地方按实际安装地更改 echo off REM 声明采用UT…...

3090. 每个字符最多出现两次的最长子字符串

说在前面 &#x1f388;不知道大家对于算法的学习是一个怎样的心态呢&#xff1f;为了面试还是因为兴趣&#xff1f;不管是出于什么原因&#xff0c;算法学习需要持续保持。 题目描述 给你一个字符串 s &#xff0c;请找出满足每个字符最多出现两次的最长子字符串&#xff0c;…...

26.活锁、饥饿锁

两个线程&#xff0c;相互改变了对方结束条件&#xff0c;导致两个线程不能结束。执行时间也都是一样&#xff0c;导致两个线程永远不会结束。 Slf4j public class LiveLockDemo {static volatile int count 10;public static void main(String[] args) {new Thread(() ->…...

docker 安装nginx

一、先查看有没有nginx镜像 docker images 二、发现没有nginx镜像&#xff0c;下载最新镜像 docker pull nginx 三、运行镜像 为了先复制出部分文件&#xff0c;先启动一个临时容器 docker run --name nginx -p 9001:80 -d nginx docker cp nginx:/etc/nginx/conf.d /home/…...

2024年阿里云新用户便宜购买云服务器攻略:5大细节助你降低购买成本

随着互联网的蓬勃发展&#xff0c;无论是个人还是企业&#xff0c;拥有一个稳定且高效的网站或APP已成为提升竞争力的关键。为了将这些项目部署并运行起来&#xff0c;购买一台实用又便宜的云服务器是必不可少的。阿里云作为国内首屈一指的云服务提供商&#xff0c;自然成为了众…...

[2025CVPR]DeepVideo-R1:基于难度感知回归GRPO的视频强化微调框架详解

突破视频大语言模型推理瓶颈,在多个视频基准上实现SOTA性能 一、核心问题与创新亮点 1.1 GRPO在视频任务中的两大挑战 ​安全措施依赖问题​ GRPO使用min和clip函数限制策略更新幅度,导致: 梯度抑制:当新旧策略差异过大时梯度消失收敛困难:策略无法充分优化# 传统GRPO的梯…...

C++实现分布式网络通信框架RPC(3)--rpc调用端

目录 一、前言 二、UserServiceRpc_Stub 三、 CallMethod方法的重写 头文件 实现 四、rpc调用端的调用 实现 五、 google::protobuf::RpcController *controller 头文件 实现 六、总结 一、前言 在前边的文章中&#xff0c;我们已经大致实现了rpc服务端的各项功能代…...

在 Nginx Stream 层“改写”MQTT ngx_stream_mqtt_filter_module

1、为什么要修改 CONNECT 报文&#xff1f; 多租户隔离&#xff1a;自动为接入设备追加租户前缀&#xff0c;后端按 ClientID 拆分队列。零代码鉴权&#xff1a;将入站用户名替换为 OAuth Access-Token&#xff0c;后端 Broker 统一校验。灰度发布&#xff1a;根据 IP/地理位写…...

Rust 异步编程

Rust 异步编程 引言 Rust 是一种系统编程语言,以其高性能、安全性以及零成本抽象而著称。在多核处理器成为主流的今天,异步编程成为了一种提高应用性能、优化资源利用的有效手段。本文将深入探讨 Rust 异步编程的核心概念、常用库以及最佳实践。 异步编程基础 什么是异步…...

Rapidio门铃消息FIFO溢出机制

关于RapidIO门铃消息FIFO的溢出机制及其与中断抖动的关系&#xff0c;以下是深入解析&#xff1a; 门铃FIFO溢出的本质 在RapidIO系统中&#xff0c;门铃消息FIFO是硬件控制器内部的缓冲区&#xff0c;用于临时存储接收到的门铃消息&#xff08;Doorbell Message&#xff09;。…...

学校时钟系统,标准考场时钟系统,AI亮相2025高考,赛思时钟系统为教育公平筑起“精准防线”

2025年#高考 将在近日拉开帷幕&#xff0c;#AI 监考一度冲上热搜。当AI深度融入高考&#xff0c;#时间同步 不再是辅助功能&#xff0c;而是决定AI监考系统成败的“生命线”。 AI亮相2025高考&#xff0c;40种异常行为0.5秒精准识别 2025年高考即将拉开帷幕&#xff0c;江西、…...

在web-view 加载的本地及远程HTML中调用uniapp的API及网页和vue页面是如何通讯的?

uni-app 中 Web-view 与 Vue 页面的通讯机制详解 一、Web-view 简介 Web-view 是 uni-app 提供的一个重要组件&#xff0c;用于在原生应用中加载 HTML 页面&#xff1a; 支持加载本地 HTML 文件支持加载远程 HTML 页面实现 Web 与原生的双向通讯可用于嵌入第三方网页或 H5 应…...

【7色560页】职场可视化逻辑图高级数据分析PPT模版

7种色调职场工作汇报PPT&#xff0c;橙蓝、黑红、红蓝、蓝橙灰、浅蓝、浅绿、深蓝七种色调模版 【7色560页】职场可视化逻辑图高级数据分析PPT模版&#xff1a;职场可视化逻辑图分析PPT模版https://pan.quark.cn/s/78aeabbd92d1...

Java编程之桥接模式

定义 桥接模式&#xff08;Bridge Pattern&#xff09;属于结构型设计模式&#xff0c;它的核心意图是将抽象部分与实现部分分离&#xff0c;使它们可以独立地变化。这种模式通过组合关系来替代继承关系&#xff0c;从而降低了抽象和实现这两个可变维度之间的耦合度。 用例子…...

【网络安全】开源系统getshell漏洞挖掘

审计过程&#xff1a; 在入口文件admin/index.php中&#xff1a; 用户可以通过m,c,a等参数控制加载的文件和方法&#xff0c;在app/system/entrance.php中存在重点代码&#xff1a; 当M_TYPE system并且M_MODULE include时&#xff0c;会设置常量PATH_OWN_FILE为PATH_APP.M_T…...