Java 集合框架大师课:集合框架的暗黑料理(六)
🔮Java 集合框架大师课:集合框架的暗黑料理(六)——弱引用与幽灵队列
第一章 弱引用:Java世界的塑料兄弟情 💔
四大引用类型生死簿
// 四类引用生死实验
Object strongObj = new Object(); // 强引用:钢铁侠 🦾
SoftReference<Object> softRef = new SoftReference<>(new Object()); // 软引用:橡皮盾 🛡️
WeakReference<Object> weakRef = new WeakReference<>(new Object()); // 弱引用:纸片人 📄
ReferenceQueue<Object> phantomQueue = new ReferenceQueue<>();
PhantomReference<Object> phantomRef = new PhantomReference<>(new Object(), phantomQueue); // 虚引用:幽灵 👻System.gc(); // 召唤GC阎王System.out.println("强引用存活: " + strongObj); // java.lang.Object@6d311334
System.out.println("软引用存活: " + softRef.get()); // null(若内存充足则可能存活)
System.out.println("弱引用阵亡: " + weakRef.get()); // null
System.out.println("虚引用队列: " + phantomQueue.poll()); // 出现PhantomReference对象
🔗 引用类型生存法则:
🔑 四类引用代码核心知识点
📌 关键特性解析
- 强引用生存法则
Object strongObj = new Object(); // 钢铁长城永不倒
- 必须显式置为
null
才会被回收 - 集合类中的元素引用默认都是强引用
- 软引用缓存策略
SoftReference<Object> cache = new SoftReference<>(data);
- 内存不足时的安全气囊
- 适合实现图片缓存等需要自动清理的场景
- 可通过
-Xmx
参数调整内存阈值观察回收行为
- 弱引用速死特性
WeakHashMap<Key,Value> map = new WeakHashMap<>();
- 常用于监听器模式防止内存泄漏
- 与
ReferenceQueue
配合可实现精确清理
- 虚引用幽灵特性
PhantomReference<Object> ref = new PhantomReference<>(obj, queue);
get()
永远返回null
,需配合队列使用- 必须手动调用
clear()
释放资源 - 唯一能感知对象finalize后的引用类型
⚔️ 实战技巧与避坑指南
技巧一:缓存系统设计
// 三级缓存架构示例
Map<String, SoftReference<Bitmap>> memoryCache = new ConcurrentHashMap<>();
Map<String, WeakReference<Bitmap>> activityCache = new WeakHashMap<>();
DiskLruCache diskCache; // 持久化存储// 内存不足时自动释放SoftReference缓存
// 界面关闭时自动清除WeakHashMap缓存
技巧二:监控引用状态
// 虚引用监控线程模板
new Thread(() -> {while(true) {Reference<?> ref = phantomQueue.remove();cleanNativeResource(ref); // 释放关联的Native资源}
}).start();
避坑指南表
错误场景 | 后果 | 解决方案 |
---|---|---|
软引用与强引用长期共存 | 缓存永不失效 | 用WeakHashMap管理缓存键 |
虚引用未及时clear() | Native资源泄漏 | 队列监听线程中显式清理 |
弱引用保存大对象 | 频繁GC影响性能 | 配合SoftReference使用 |
直接修改ReferenceQueue | 监控机制失效 | 使用remove/poll方法获取引用 |
🔥 高阶调试技巧
// 强制验证软引用行为(IDEA调试技巧)
public static void testSoftReference() {Object obj = new byte[1024 * 1024 * 10]; // 分配10MBSoftReference<Object> ref = new SoftReference<>(obj);obj = null; // 断开强引用// 在IDEA的Memory工具中手动执行GC// 观察ref.get()在不同内存压力下的状态
}
📜 引用类型生存法则表:
引用类型 | GC回收条件 | 典型应用场景 | 生存强度 🌡️ | 生存条件 | 回收灵敏度 | 代码标识 |
---|---|---|---|---|---|---|
强引用(Strong) | 永不自动回收 | 核心业务对象 | 钛合金级 🛡️ | 存在引用链 | ⚡️ 最低 | = 直接赋值 |
软引用(Soft) | 内存不足时回收 | 缓存系统 | 橡皮级 🧽 | 内存不足时 | 🌧️ 中等 | SoftReference 包裹 |
弱引用(Weak) | 发现即回收 | WeakHashMap | 纸片级 📄 | 下次GC必定回收 | 🔥 高 | WeakReference 包裹 |
虚引用(Phantom) | 随时可能回收 | 资源清理跟踪 | 空气级 🌬️ | 随时可能回收 | 💨 最高 | PhantomReference 包裹 |
📌 黄金法则:强引用是默认选择,软引用用于缓存,弱引用处理临时数据,虚引用只做监控。理解各引用类型的回收触发边界,才能写出内存安全的Java程序!
第二章 幽灵队列:阴阳两界的邮差 👻📬
2.1 引用队列工作原理
// 监控对象死亡的"死亡笔记" 📓
ReferenceQueue<byte[]> queue = new ReferenceQueue<>();
WeakReference<byte[]> ref = new WeakReference<>(new byte[1024*1024], queue);System.out.println(queue.poll()); // null (对象还活着)
System.gc();Reference<? extends byte[]> deadRef = queue.remove(500);
System.out.println(deadRef); // java.lang.ref.WeakReference@452b3a41 (灵魂已收割)
⚡ 引用队列三定律:
- 对象被GC标记为"死亡"时入队
- 队列中的引用对象已无实体
- 通过队列可实现资源清理
📌 引用对象生命周期图
💡 实战应用场景
// 案例:大型图片缓存清理器
public class ImageCache {private final ReferenceQueue<BufferedImage> queue = new ReferenceQueue<>();private final List<WeakReference<BufferedImage>> cache = new ArrayList<>();// 添加缓存并关联队列public void add(BufferedImage image) {cache.add(new WeakReference<>(image, queue));}// 启动清理线程public void startCleaner() {new Thread(() -> {while (true) {try {Reference<?> ref = queue.remove();// 找到对应的缓存项并移除cache.removeIf(wr -> wr == ref);} catch (InterruptedException e) { /*...*/ }}}).start();}
}
2.2 幽灵引用实战:监控大对象销毁
// 创建1GB大对象监控
ReferenceQueue<byte[]> phantomQueue = new ReferenceQueue<>();
PhantomReference<byte[]> phantomRef = new PhantomReference<>(new byte[1024*1024*1024], phantomQueue);new Thread(() -> {try {System.out.println("等待对象投胎...");phantomQueue.remove(); // 阻塞直到对象销毁System.out.println("检测到1GB内存释放!🎉");// 触发后续清理操作} catch (InterruptedException e) {Thread.currentThread().interrupt();}
}).start();
🔑 关键知识点拆解
- 虚引用三大法则
PhantomReference<byte[]> ref = new PhantomReference<>(obj, queue);
System.out.println(ref.get()); // 永远输出null 👻
- 必须关联
ReferenceQueue
get()
始终返回null
- 对象销毁后才会入队
- 监控线程设计要点
phantomQueue.remove(); // 阻塞式监听
// 替代方案(非阻塞轮询):
while(true) {Reference<?> ref = phantomQueue.poll();if(ref != null) process(ref);Thread.sleep(1000);
}
- 资源释放最佳实践
phantomRef.clear(); // 必须手动清除
Runtime.getRuntime().gc(); // 建议但不强制GC
System.runFinalization(); // 执行finalize方法
💡 实战进阶技巧
// 案例:大文件句柄自动关闭
class FileWatcher {private static final ReferenceQueue<FileChannel> QUEUE = new ReferenceQueue<>();private final Map<PhantomReference<FileChannel>, Closeable> resources = new ConcurrentHashMap<>();void watch(FileChannel channel, Closeable resource) {PhantomReference<FileChannel> ref = new PhantomReference<>(channel, QUEUE);resources.put(ref, resource);new Thread(() -> {try {QUEUE.remove();resources.remove(ref).close(); // 自动关闭句柄System.out.println("文件资源已释放");} catch (Exception e) { /*...*/ }}).start();}
}
第三章 WeakHashMap 源码屠宰场 🔪
3.1 expungeStaleEntries 方法解析
// 清理僵尸Entry的核心代码 🧟
private void expungeStaleEntries() {for (Object x; (x = queue.poll()) != null;) {synchronized (queue) {Entry<K,V> e = (Entry<K,V>) x;int i = indexFor(e.hash, table.length);Entry<K,V> prev = table[i];Entry<K,V> p = prev;while (p != null) {Entry<K,V> next = p.next;if (p == e) {if (prev == e)table[i] = next;elseprev.next = next;e.value = null; // 帮助GCsize--;break;}prev = p;p = next;}}}
}
3.2 哈希桶结构异变史
📌 WeakHashMap特性速查表:
特性 | 普通HashMap | WeakHashMap | 注意事项 ⚠️ |
---|---|---|---|
Key回收机制 | 永不回收 | GC时回收 | Value需无其他引用 |
迭代器稳定性 | 稳定 | 可能突变 | 不要缓存entrySet |
containsValue性能 | O(n) | 可能更慢 | 存在僵尸Entry干扰 |
内存敏感场景 | 不适用 | 推荐使用 | 适合做缓存底层存储 |
第四章 暗黑实战:用幽灵队列实现连接池监控 🕶️
4.1 数据库连接池监控器
// 监控Connection关闭情况
public class ConnectionMonitor {private static final ReferenceQueue<Connection> QUEUE = new ReferenceQueue<>();private static final Map<PhantomReference<Connection>, String> TRACE_MAP = new ConcurrentHashMap<>();public static Connection wrap(Connection realConn) {PhantomReference<Connection> ref = new PhantomReference<>(realConn, QUEUE);TRACE_MAP.put(ref, "创建于: " + new Date());return new ProxyConnection(realConn);}static {new CleanerThread().start();}private static class CleanerThread extends Thread {public void run() {while (true) {try {PhantomReference<?> ref = (PhantomReference<?>) QUEUE.remove();String info = TRACE_MAP.remove(ref);System.out.println("连接关闭警告: " + info + " 未正确释放!🚨");} catch (InterruptedException e) {break;}}}}
}
4.2 监控效果演示
Connection conn = ConnectionMonitor.wrap(datasource.getConnection());
conn.close(); // 正确关闭无事发生Connection leakedConn = ConnectionMonitor.wrap(datasource.getConnection());
// 忘记close,GC后输出:
// 连接关闭警告: 创建于: Wed Mar 15 14:11:22 CST 2025 未正确释放!🚨
第五章 暗黑陷阱集:引用使用七大罪 💀
5.1 常见翻车现场
// 陷阱1:强引用藏匿
WeakHashMap<Object, String> map = new WeakHashMap<>();
Object key = new Object();
map.put(key, "Value");
key = null; // 但map仍然持有Entry的强引用!😱// 陷阱2:值对象持有key
class User {String name;// 错误示范!value持有key引用形成环Map<User, String> map = new WeakHashMap<>();
}
5.2 生存法则对照表
正确姿势 ✅ | 错误姿势 ❌ | 后果 💥 |
---|---|---|
使用短期局部变量作为Key | 用Long-term对象作为Key | 永远无法回收 |
Value不持有Key引用 | Value内部包含Key | 内存泄漏 |
定期调用size()/isEmpty() | 仅依赖GC | 僵尸Entry堆积 |
配合ReferenceQueue使用 | 直接监控对象状态 | 无法感知精确回收时机 |
🚀 下期预告:《集合框架的量子力学——CopyOnWrite与CAS魔法》 ⚛️
// 彩蛋代码:ConcurrentHashMap的量子态put
final V putVal(K key, V value, boolean onlyIfAbsent) {// 当多个线程同时put时...if ((fh = f.hash) == MOVED)tab = helpTransfer(tab, f); // 进入量子纠缠态!else {synchronized (f) { // 坍缩为经典态// ...省略碰撞处理代码}}
}
🌌 灵魂拷问 :当两个线程同时触发扩容,ConcurrentHashMap如何维持时空连续性?答案下期揭晓!
相关文章:
Java 集合框架大师课:集合框架的暗黑料理(六)
🔮Java 集合框架大师课:集合框架的暗黑料理(六)——弱引用与幽灵队列 第一章 弱引用:Java世界的塑料兄弟情 💔 四大引用类型生死簿 // 四类引用生死实验 Object strongObj new Object(); …...
LVI-SAM、VINS-Mono、LIO-SAM算法的阅读参考和m2dgr数据集上的复现(留作学习使用)
ROS一键安装参考: ROS的最简单安装——鱼香一键安装_鱼香ros一键安装-CSDN博客 opencv官网下载4.2.0参考:https://opencv.org/releases/page/3/ nvidia驱动安装:ubuntu18.04 安装显卡驱动 - 开始战斗 - 博客园 cuda搭配使用12 cuda安装1:Ub…...
京鲁医疗健康专家委员会聊城专家团成立
3月13日由京鲁医疗健康专家委员会指导,聊城市委人才工作领导小组办公室、聊城市卫生健康委员会、聊城市人才引进服务中心主办的"智链医脉.新启未来"聊城卫生健康产才共融发展交流会在北京人卫酒店召开。会上,京鲁医疗健康专家委员会…...
MySQL的事务机制
事务 事务概念:事务是一个完整的操作单元,不可分割,事务中的操作要么全部成功,要么全部失败。 1. 事务特性 ACID 1.1 原子性(A) 一个事务中所有操作是不能被分割的,要么所有的操作都成功&am…...
30、Vuex 为啥可以进行缓存处理
Vuex 状态管理基础与缓存的关联 Vuex 的核心概念: Vuex 主要由五个部分组成:state、mutations、actions、getters和modules。其中,state是存储数据的地方,类似于一个全局的数据仓库。在这个菜谱 APP 的例子中,缓存的数…...
OpenAI Agents SDK 中文文档 中文教程 (5)
英文文档原文详见 OpenAI Agents SDKhttps://openai.github.io/openai-agents-python/ 本文是OpenAI-agents-sdk-python使用翻译软件翻译后的中文文档/教程。分多个帖子发布,帖子的目录如下: (1) OpenAI 代理 SDK, 介绍及快速入门 (2)Open…...
如何处理PHP中的文件上传错误
如何处理PHP中的文件上传错误 在Web开发中,文件上传是一个常见的功能需求。然而,文件上传过程中可能会遇到各种错误,如文件大小超出限制、文件类型不被允许、上传过程中断等。为了确保用户能够顺利上传文件,并且开发者能够有效地…...
mac安装python没有环境变量怎么办?zsh: command not found: python
在mac电脑上,下载Python安装包进行安装之后,在终端中,输入python提示: zsh: command not found: python 一、原因分析 首先,这个问题不是因为python没有安装成功的原因,是因为python安装的时候,没有为我们添加环境变量导致的,所以我们只需要,在.zshrc配置文件中加上环…...
湿大气校正效应
目的 修正由于大气中的水汽对雷达波传播速度的影响,以提高海面高度测量的准确性,有时候也叫做对流层校正。水汽的时空变化复杂,难以直接通过气象模型准确预测。水汽的折射作用使雷达信号的传播速度减慢,从而导致测量的海面高度虚增…...
算法系列之回溯算法求解数独及所有可能解
有没有对数独感兴趣的朋友呢?数独作为一款经典的逻辑游戏,其目标是在一个9x9的方格中填入数字1至9,确保每一行、每一列以及每一个3x3的子网格中都包含这些数字且不重复。尽管数独的规则看似简单,但编写一个能够自动求解数独的程序…...
动态路径规划——01背包问题讲解和通过滚动数组优化
如果没有动态路径规划基础的兄弟可以出去了,这个题目有两个问题 第一问讲解: 1.定义状态表示 刚开始我做的时候根据我的经验定义了一个状态表示dp[i]表示从1到i个物品中选择的最大价值,但是这个状态表示有一个明显的问题,我怎么知…...
蓝队基本技能 web入侵指南 日志分析 后门查杀 流量分析
前言 为了赶工我是没学过红队的,首先我们要做的是 1、拿到用户给的web的时候 要先知道 web的源码 服务器 中间件 数据库这些信息 2、知道web日志放在哪里 会一些基本的分析 3、webshell查杀的基本技能 4、会分析基本的工具链 会写报告 .NET IIS 配置…...
docker基本应用和相关指令
文章目录 概要镜像管理容器操作网络管理数据卷管理其他常用指令典型场景示例小结 概要 Docker的命令通常分为几个大类,比如镜像管理(images)、容器管理(containers)、网络(network)、数据卷&…...
Django REST Framework中的序列化器类和视图类
序列化器类 一、Serializer序列化类 Serializer是DRF的序列化器基类,提供基本功能,使用Serializer类需要自己定义字段名称和类型。 BookSerializer(Serializer):name serializers.CharField()price serlializers.IntegerField()date serlializers.…...
模拟人生4大型MOD整合包3000+
存档介绍 (懒人萌新必备) 游戏内全面的人物美化、房屋改造、地图美化 美化人物250个(颜值在线,均搭配八套服饰) 全地图房屋改造(住宅、公寓、公用/商业地段等) 游戏内22张地图均已美化替换 存档…...
算法基础 -- Brian Kernighan 算法初识
Brian Kernighan 算法:利用 x & (x - 1) 逐步清除最低位的 1 1. 算法原理 x & (x - 1) 这个操作的作用是每次清除 x 的最低位的 1。由于 二进制的减法 会影响最低的 1,我们可以利用这一特性不断去除 1,直到 x 变为 0,从…...
基于Uniapp开发tab选项卡/标签栏前端组件
在开发一些业务场景时候,可能需要切换标签栏来展示不同的信息列表。 为此开发了一个Uniapp组件(myTab),下面为组件的展示效果: 案例代码: <template><view class"content"><myt…...
双向广搜
从两侧同时展开,那测数据少就从哪侧展,两者展开结果出现一样的,返回答案 127. 单词接龙 - 力扣(LeetCode) class Solution { public:int ladderLength(string beginWord, string endWord, vector<string>& wordList) {unordered_set<stri…...
2024下半年真题 系统架构设计师 论文写作 答案解析
系统架构设计师第二版VIP课程https://edu.csdn.net/course/detail/40283 试题一 论软件维护及其应用 请围绕“论软件维护及其应用”论题,依次从以下三个方面进行论述。 1.概要叙述你参与分析设计的软件项目以及你在其中所承担的主要工作。 2.请介绍软件维护的内…...
【VSCODE 插件 可视化】:SVG 编辑插件 SVG Editor
插件下载 svgeditor 创建文件 Windows/Linux 快捷键 Ctrl Shift P 打开VSCODE 命令面板查找 New File With Svg Editor 编辑文件 保存文件 打开文件以继续编辑 CG 选中多个:shift单击没找到横向分布功能无法用键盘微调位置...
go中实现子模块调用main包中函数的方法
你提到的“import cycle not allowed”错误是 Go 语言中一个常见的问题,表示在包的导入中存在循环依赖。在 Go 中,一个包不能直接或间接导入自己,否则就会报这个错误。 在你提到的第二个例子中,main 包和 submodule 包相互导入&a…...
VUE的脚手架搭建引入类库
VUE的小白脚手架搭建 真的好久好久自己没有发布自己博客了,对于一直在做后端开发的我 ,由于社会卷啊卷只好学习下怎么搭建前端,一起学习成长吧~哈哈哈(最终目的,能够懂并简易开发) 文章目录 VUE的小白脚手架搭建1.下载node.js2.安装vue脚手架3.创建一个项目4.代码规范约束配置(…...
java maven依赖传递以及版本冲突
文章目录 基本背景基本排查冲突工具依赖传递:很多依赖到底使用哪个版本的依赖dependencyManagement 作用exclusions其他问题 基本背景 你使用 java,使用 maven pom.xml 管理你的依赖包 可能常常遇到依赖版本冲突,或者很多依赖包,…...
【3-14 STC-pair超级详细的解说】
1. pair的定义和结构 • 基础概念:考察对std::pair模板类的理解,包括其头文件(<utility>)和基本语法(pair<T1, T2>)。 • 成员访问:测试对first和second成员变量的使用能力。 • 构…...
Python开发合并多个PDF文件
前言 在我们的工作中,可能有以下场景需要用到合并多个PDF: 文档归档:在企业或组织中,常常需要将相关的文档(如合同、报告、发票等)合并为一个PDF文件,以便于归档和管理。 报告生成:在…...
基于SpringBoot + Vue 的房屋租赁系统
基于springboot的房屋租赁管理系统-带万字文档 SpringBootVue房屋租赁管理系统 送文档 本项目有前台和后台两部分、多角色模块、不同角色权限不一样 共分三种角色:用户、管理员、房东 管理员:个人中心、房屋类型管理、房屋信息管理、预约看房管理、合…...
Qt QML实现弹球消砖块小游戏
前言 弹球消砖块游戏想必大家都玩过,很简单的小游戏,通过移动挡板反弹下落的小球,然后撞击砖块将其消除。本文使用QML来简单实现这个小游戏。 效果图: 正文 代码目录结构如下: 首先是小球部分,逻辑比较麻…...
ROS实践(四)机器人SLAM建图(gmapping)
目录 一、SLAM技术 二、常用工具和传感器 三、相关功能包 1. gmapping建图功能包 2. map_server 四、SLAM 建图实验 1. 配置gmapping(launch文件) 2. 启动机器人仿真(含机器人以及传感器) 3. 运行gmapping节点 4. 启动rviz可视化工具 5. 保存地图文件 一、SLAM技…...
使用Arduino、ESP8266和GPS在Google地图上追踪车辆
使用 ESP8266、GPS 和 Google 地图的 Arduino Vehicle Tracker 如今,车辆跟踪系统变得非常重要,尤其是在车辆被盗的情况下。如果您的车辆安装了 GPS 系统,您可以跟踪您的车辆位置,它可以帮助警方追踪被盗车辆。 在这里,我们正在构建更高级版本的车辆跟踪系统,您可以在其…...
python数据分析文件夹篇--pandas,openpyxl,xlwings三种方法批量创建、 复制、删除工作表
前言 之前我们学习了使用pandas灵活地读取数据,包括读取工作簿中一个或几个工作表,读取工作表中一行或多行,一列或多列数据,还学习了如何将数据灵活保存到本地。 今天我们学习一下文件夹中文件的批量处理操作,包括批量…...
MyBatis 的一级、二级缓存
文章目录 1️⃣ 一级缓存(Local Cache)📌 定义🚀 示例代码 2️⃣ 二级缓存(Global Cache)📌 定义🚀 使用方式 3️⃣ 一级缓存 vs. 二级缓存 📊4️⃣ 数据共享问题&#x…...
掌握市场先机:9款销售渠道管理工具深度测评
本文主要介绍了以下9款销售渠道管理工具:1.纷享销客; 2.销帮帮; 3.小满CRM; 4.有赞; 5.Oracle NetSuite; 6.Salesforce Sales Cloud; 7.Cin7; 8.Pipedrive; 9.BigCommerc…...
【计算机网络通信 MQTT和AMQP的原理及应用场景、优缺点】
MQTT(Message Queuing Telemetry Transport)和AMQP(Advanced Message Queuing Protocol)都是常用的消息中间件协议,以下是它们的原理、应用场景、优缺点介绍: 原理 MQTT 基于发布/订阅模式,有…...
如何搭建一个适配微信小程序,h5,app的uni-app项目
在vscode搭建 uni-app 项目(Vue 3 Vite Pinia uView Plus) 一、环境准备 1. 安装 Node.js 确保已安装 Node.js(需≥14版本),可通过以下命令检查版本: node -v2. 安装 VSCode 从 VSCode 官网 下载并…...
3.14学习总结 排序算法
插入排序: 1.直接插入排序 维护一个有序区,把元素一个个插入有序区的适当位置,直到所有元素都有序为止。 for (int i 0;i < n - 1;i) {//升序int end i;int temp k[end 1];while (end > 0) {if (temp < k[end]) {k[end 1] …...
模拟类似 DeepSeek 的对话
以下是一个完整的 JavaScript 数据流式获取实现方案,模拟类似 DeepSeek 的对话式逐段返回效果。包含前端实现、后端模拟和详细注释: <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><titl…...
实用小工具——快速获取数据库时间写法
最近我遇到了一个比较棘手的问题:在工作中,各个项目所使用的数据库类型各不相同。这导致我习惯性地使用Oracle的SQL语句进行编写,但每次完成后都会遇到报错,最终才意识到项目的数据库并非Oracle。为了避免这种情况,我需…...
完善机器人:让 DeepSeek 使用Vue Element UI快速搭建 AI 交互页面
在前两篇文章中,我们已经使用 AI 生成了 Java API,并创建了一个简单的 HTML JavaScript 网页,让用户可以与 AI 机器人聊天。但如果我们想要一个更美观、更专业的交互界面,该怎么办呢?🤔 本篇文章…...
PC端QT实现mqtt客户端发布和订阅
在Windows11-64位系统下使用QT开发桌面应用程序,实现mqtt客户端的发布和订阅功能。 需求: mqtt代理服务器 --mosquitto; mqtt客户端工具 -- mqtt.fx; qtcreator开发工具 -- qtcreator6.8.2版本; 过程:…...
蓝桥云客 挖矿
0挖矿 - 蓝桥云课 问题描述 小蓝正在数轴上挖矿,数轴上一共有 n 个矿洞,第 i 个矿洞的坐标为 ai。小蓝从 0 出发,每次可以向左或向右移动 1 的距离,当路过一个矿洞时,就会进行挖矿作业,获得 1 单位矿石&…...
React开发指南:核心、实践与案例
文章目录 一、React核心架构与设计哲学1.1 虚拟DOM与Diff算法1.2 JSX编译原理1.3 组件化设计模式1.4 Fiber架构解析1.5 组件生命周期(类组件) 二、React核心特性详解2.1 数据流管理2.2 Hooks革命2.3 Context API进阶2.4 自定义Hooks设计模式 三、React 1…...
落雪音乐Pro 8.8.6 | 内置8条音源,无需手动导入,纯净无广告
洛雪音乐Pro版内置多组稳定音源接口,省去手动导入的繁琐操作,安装即可畅听海量音乐。延续原版无广告的纯净体验,支持歌单推荐与音源切换,满足个性化听歌需求。此版本仅支持在线播放,无法下载音乐,且与原版不…...
Java入职篇(1)——心态篇
Java入职篇(1)——心态篇 本人终于通过辛苦的学习以及经过大量的面试,终于拿到一份offer了!,但是的有点担心入职之后,不能胜任工作,不能安全度过试用期。在入职后能够顺利渡过刚开始最难熬的实…...
【后端】【django】Django DRF `@action` 详解:自定义 ViewSet 方法
Django DRF action 详解:自定义 ViewSet 方法 在 Django REST Framework(DRF)中,action 装饰器用于为 ViewSet 添加自定义的 API 端点。相比于 update、create 等默认方法,action 允许我们定义 更加清晰、语义化 的 A…...
【Vue.js】
一、简介 1、概述 官网GitHub - Vuejs Vue 是一款用于构建用户界面的 JavaScript 框架。它基于标准 HTML、CSS 和 JavaScript 构建,并提供了一套声明式的、组件化的编程模型,帮助你高效地开发用户界面。 Vue.js作为一个渐进式框架,其设计理…...
SSL 和 TLS 认证
SSL(Secure Sockets Layer,安全套接层)认证是一种用于加密网络通信和验证服务器身份的安全技术。它是TLS(Transport Layer Security,传输层安全协议)的前身,虽然现在大多数应用使用的是TLS&…...
可复用表格组件设计与实现:分页、排序、筛选全功能解析
文章目录 一、组件设计思路1.1 功能需求分析1.2 技术选型 二、组件架构设计2.1 组件结构2.2 数据流设计 三、核心代码实现3.1 基础表格组件3.2 状态管理 四、功能模块实现4.1 分页组件4.2 排序控制4.3 筛选控制 五、性能优化方案5.1 虚拟滚动5.2 防抖筛选 六、完整测试方案6.1 …...
SmartFormat:轻量级文本模板库,轻松替代 string.Format
推荐一个 C# 编写的轻量级文本模板库,可以作为 string.Format 的替代品。 01 项目简介 SmartFormat不仅继承了 string.Format 的功能,还扩展了更多高级特性,例如命名占位符、列表格式化、本地化支持、复数化等。SmartFormat 提供了高性能、…...
【贪心算法4】
力扣452.用最少数量的剪引爆气球 链接: link 思路 这道题的第一想法就是如果气球重叠得越多那么用箭越少,所以先将气球按照开始坐标从小到大排序,遇到有重叠的气球,在重叠区域右边界最小值之前的区域一定需要一支箭,这道题有两…...
ES 使用geo point 查询离目标地址最近的数据
需求描述:项目中需要通过经纬度坐标查询目标地所在的行政区。 解决思路大致有种,使用es和mysql分别查询。 1、使用es进行查询 将带有经纬度坐标的省市区数据存入es中,mappings字段使用geo point类型,索引及查询dsl如下。 geo p…...