Java Map 深度解析
一、HashMap 底层实现详解
1. 核心数据结构
HashMap 在 JDK 8 中的底层结构是 数组 + 链表 + 红黑树,其核心成员变量包括:
transient Node<K,V>[] table;
:哈希桶数组transient int size;
:实际键值对数量int threshold;
:扩容阈值(capacity * loadFactor)final float loadFactor;
:负载因子(默认 0.75f)
2. 哈希函数与定位原理
static final int hash(Object key) {int h;return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);
}
该哈希函数通过高 16 位与低 16 位异或,减少哈希冲突概率。最终桶位置计算方式为:(n - 1) & hash
,其中 n
为数组长度。
3. 扩容机制源码分析
当 size > threshold
时触发扩容,每次扩容为原容量的 2 倍:
final Node<K,V>[] resize() {// ... 省略部分代码newCap = oldCap << 1; // 容量翻倍// ...// 重新计算哈希位置for (int j = 0; j < oldTab.length; ++j) {Node<K,V> e;if ((e = oldTab[j]) != null) {oldTab[j] = null;if (e.next == null)newTab[e.hash & (newCap - 1)] = e;else if (e instanceof TreeNode)((TreeNode<K,V>)e).split(this, newTab, j, oldCap);else { // 链表拆分逻辑// ...}}}return newTab;
}
4. 链表转红黑树条件
当链表长度达到 8 且数组长度超过 64 时,链表转换为红黑树:
static final int TREEIFY_THRESHOLD = 8;
static final int MIN_TREEIFY_CAPACITY = 64;
二、LinkedHashMap 源码级解析
1. 双向链表结构
通过继承 HashMap.Node
实现双向链表:
static class Entry<K,V> extends HashMap.Node<K,V> {Entry<K,V> before, after;Entry(int hash, K key, V value, Node<K,V> next) {super(hash, key, value, next);}
}
2. 访问顺序实现
构造函数中 accessOrder
参数控制访问顺序:
public LinkedHashMap(int initialCapacity,float loadFactor,boolean accessOrder) {super(initialCapacity, loadFactor);this.accessOrder = accessOrder;
}
每次访问元素后,通过 afterNodeAccess
方法将节点移至链表尾部:
void afterNodeAccess(Node<K,V> e) {LinkedHashMap.Entry<K,V> last;if (accessOrder && (last = tail) != e) {LinkedHashMap.Entry<K,V> p =(LinkedHashMap.Entry<K,V>)e, b = p.before, a = p.after;p.after = null;if (b == null)head = a;elseb.after = a;if (a != null)a.before = b;elselast = b;if (last == null)head = p;else {p.before = last;last.after = p;}tail = p;++modCount;}
}
三、TreeMap 红黑树实现原理
1. 红黑树特性
TreeMap 基于红黑树实现,每个节点包含 5 个属性:
static final class Entry<K,V> implements Map.Entry<K,V> {K key;V value;Entry<K,V> left;Entry<K,V> right;Entry<K,V> parent;boolean color = BLACK;// ...
}
2. 插入平衡过程
插入新节点后通过 fixAfterInsertion
方法维持红黑树平衡:
private void fixAfterInsertion(Entry<K,V> x) {x.color = RED;while (x != null && x != root && x.parent.color == RED) {if (parentOf(x) == leftOf(parentOf(parentOf(x)))) {Entry<K,V> y = rightOf(parentOf(parentOf(x)));if (colorOf(y) == RED) {// 情况1:父节点和叔节点均为红色// ...} else {if (x == rightOf(parentOf(x))) {// 情况2:父节点为红色,叔节点为黑色,且当前节点为右子节点// ...}// 情况3:父节点为红色,叔节点为黑色,且当前节点为左子节点// ...}} else {// 镜像情况// ...}}root.color = BLACK;
}
3. 范围查询实现
TreeMap 支持高效的范围查询,例如:
NavigableMap<K,V> subMap(K fromKey, boolean fromInclusive,K toKey, boolean toInclusive);
底层通过红黑树的有序性快速定位边界节点。
四、ConcurrentHashMap 并发控制演进
1. JDK 7 分段锁机制
JDK 7 采用分段锁(Segment)设计,每个 Segment 继承 ReentrantLock:
static final class Segment<K,V> extends ReentrantLock implements Serializable {transient volatile HashEntry<K,V>[] table;// ...
}
默认 16 个 Segment,最多支持 16 个线程并发写。
2. JDK 8 CAS + synchronized
JDK 8 放弃分段锁,采用 CAS + synchronized 实现更细粒度的锁:
final V putVal(K key, V value, boolean onlyIfAbsent) {if (key == null || value == null) throw new NullPointerException();int hash = spread(key.hashCode());int binCount = 0;for (Node<K,V>[] tab = table;;) {Node<K,V> f; int n, i, fh;if (tab == null || (n = tab.length) == 0)tab = initTable(); // 初始化表,使用 CASelse if ((f = tabAt(tab, i = (n - 1) & hash)) == null) {if (casTabAt(tab, i, null, // CAS 插入新节点new Node<K,V>(hash, key, value, null)))break; // no lock when adding to empty bin}else if ((fh = f.hash) == MOVED)tab = helpTransfer(tab, f);else {V oldVal = null;synchronized (f) { // 对单个桶加锁if (tabAt(tab, i) == f) {if (fh >= 0) {binCount = 1;for (Node<K,V> e = f;; ++binCount) {// ...}}else if (f instanceof TreeBin) {// ...}}}// ...}}addCount(1L, binCount);return null;
}
3. 读操作无锁设计
读操作通过 volatile
关键字保证可见性,无需加锁:
public V get(Object key) {Node<K,V>[] tab; Node<K,V> e, p; int n, eh; K ek;int h = spread(key.hashCode());if ((tab = table) != null && (n = tab.length) > 0 &&(e = tabAt(tab, (n - 1) & h)) != null) {if ((eh = e.hash) == h) {if ((ek = e.key) == key || (ek != null && key.equals(ek)))return e.val;}else if (eh < 0)return (p = e.find(h, key)) != null ? p.val : null;while ((e = e.next) != null) {if (e.hash == h &&((ek = e.key) == key || (ek != null && key.equals(ek))))return e.val;}}return null;
}
五、性能对比与调优建议
1. 插入性能对比测试
import java.util.*;
import java.util.concurrent.ConcurrentHashMap;public class MapPerformanceTest {private static final int SIZE = 1000000;public static void main(String[] args) {testInsert(new HashMap<>());testInsert(new LinkedHashMap<>());testInsert(new TreeMap<>());testInsert(new ConcurrentHashMap<>());}private static void testInsert(Map<Integer, Integer> map) {long startTime = System.currentTimeMillis();for (int i = 0; i < SIZE; i++) {map.put(i, i);}long endTime = System.currentTimeMillis();System.out.println(map.getClass().getSimpleName() + " 插入 " + SIZE + " 元素耗时: " + (endTime - startTime) + "ms");}
}
典型测试结果(单位:ms):
Map 类型 | 插入 100 万元素 |
---|---|
HashMap | 250 |
LinkedHashMap | 320 |
TreeMap | 850 |
ConcurrentHashMap | 420 |
2. 遍历性能对比
private static void testTraversal(Map<Integer, Integer> map) {// 预热for (Map.Entry<Integer, Integer> entry : map.entrySet()) {// 空循环}long startTime = System.currentTimeMillis();for (Map.Entry<Integer, Integer> entry : map.entrySet()) {// 空循环}long endTime = System.currentTimeMillis();System.out.println(map.getClass().getSimpleName() + " 遍历耗时: " + (endTime - startTime) + "ms");
}
3. 调优建议
- HashMap:预估元素数量,避免频繁扩容
// 示例:预估存储1000个元素,初始容量设为1000/0.75≈1334 Map<String, Integer> map = new HashMap<>(1334);
- TreeMap:大量插入操作时,按序插入性能更优
- ConcurrentHashMap:多线程写操作时,合理设置
initialCapacity
减少扩容
六、高级应用场景
1. LRU 缓存实现
import java.util.LinkedHashMap;
import java.util.Map;public class LRUCache<K, V> extends LinkedHashMap<K, V> {private final int capacity;public LRUCache(int capacity) {super(capacity, 0.75f, true) {@Overrideprotected boolean removeEldestEntry(Map.Entry<K, V> eldest) {return size() > capacity;}};this.capacity = capacity;}public static void main(String[] args) {LRUCache<String, Integer> cache = new LRUCache<>(3);cache.put("A", 1);cache.put("B", 2);cache.put("C", 3);System.out.println(cache); // 输出: {A=1, B=2, C=3}cache.get("A");System.out.println(cache); // 输出: {B=2, C=3, A=1}cache.put("D", 4);System.out.println(cache); // 输出: {C=3, A=1, D=4}}
}
2. 频率统计
import java.util.*;
import java.util.concurrent.ConcurrentHashMap;
import java.util.stream.Collectors;public class FrequencyCounter {public static void main(String[] args) {List<String> words = Arrays.asList("apple", "banana", "apple", "cherry", "banana", "apple");// 使用 HashMap 统计词频Map<String, Integer> frequencyMap = new HashMap<>();for (String word : words) {frequencyMap.put(word, frequencyMap.getOrDefault(word, 0) + 1);}System.out.println("词频统计: " + frequencyMap);// 按频率排序List<Map.Entry<String, Integer>> sortedEntries = frequencyMap.entrySet().stream().sorted(Map.Entry.<String, Integer>comparingByValue().reversed()).collect(Collectors.toList());System.out.println("按频率排序: " + sortedEntries);// 多线程环境下的词频统计Map<String, Integer> concurrentFrequencyMap = new ConcurrentHashMap<>();words.parallelStream().forEach(word -> {concurrentFrequencyMap.compute(word, (k, v) -> v == null ? 1 : v + 1);});System.out.println("并发词频统计: " + concurrentFrequencyMap);}
}
3. 范围查询场景
import java.util.TreeMap;public class RangeQueryExample {public static void main(String[] args) {TreeMap<Integer, String> scoreMap = new TreeMap<>();scoreMap.put(85, "Alice");scoreMap.put(92, "Bob");scoreMap.put(78, "Charlie");scoreMap.put(95, "David");scoreMap.put(88, "Eve");// 查询分数在 80-90 之间的学生System.out.println("分数在 80-90 之间的学生:");scoreMap.subMap(80, true, 90, true).forEach((score, name) -> {System.out.println(name + ": " + score);});// 查询分数高于 90 的学生System.out.println("分数高于 90 的学生:");scoreMap.tailMap(90, false).forEach((score, name) -> {System.out.println(name + ": " + score);});}
}
七、常见误区与注意事项
-
HashMap 的 null 键处理
- null 键总是存储在 table [0] 位置
- 仅允许一个 null 键
-
TreeMap 的排序问题
// 错误示例:Key 类型未实现 Comparable 接口 Map<Person, String> treeMap = new TreeMap<>(); treeMap.put(new Person("Alice", 25), "Engineer"); // 抛出 ClassCastException// 正确示例:指定 Comparator Map<Person, String> treeMap = new TreeMap<>(Comparator.comparingInt(Person::getAge));
-
ConcurrentHashMap 的弱一致性
ConcurrentHashMap<String, Integer> map = new ConcurrentHashMap<>(); map.put("A", 1); map.put("B", 2);// 迭代器创建后,新增元素可能不会被遍历到 Iterator<String> iterator = map.keySet().iterator(); map.put("C", 3);while (iterator.hasNext()) {System.out.println(iterator.next()); // 可能不会输出 "C" }
八、总结与选型指南
特性 | HashMap | LinkedHashMap | TreeMap | ConcurrentHashMap |
---|---|---|---|---|
底层结构 | 哈希表 | 哈希表 + 双向链表 | 红黑树 | 哈希表 + CAS + 锁 |
时间复杂度 (插入 / 查询) | O(1) | O(1) | O(log n) | O(1) |
顺序性 | 无 | 插入 / 访问顺序 | 键有序 | 无 |
线程安全 | 否 | 否 | 否 | 是 |
null 键 / 值支持 | 支持 | 支持 | 仅值支持 | 不支持 |
适用场景 | 通用场景 | LRU 缓存 | 范围查询 | 高并发环境 |
通过深入理解各类型 Map 的底层实现和特性,开发者可以根据具体业务场景做出最优选择,避免常见陷阱,充分发挥不同 Map 实现的性能优势。
相关文章:
Java Map 深度解析
一、HashMap 底层实现详解 1. 核心数据结构 HashMap 在 JDK 8 中的底层结构是 数组 链表 红黑树,其核心成员变量包括: transient Node<K,V>[] table;:哈希桶数组transient int size;:实际键值对数量int threshold;&…...
异地组网工具
目前手头上两台服务器(一台主力,一台有gpu用来跑点深度学习任务),两台pc(一台是主力,一台是便携碎片化时间随时赶工用); 之前组网的时候,用zerotiertailscale࿰…...
我们为什么要模拟
大约 25 年前,当我开始从事高速 PCB 设计时,速度很慢,层数少,介电常数和损耗角正切很高,设计裕量很宽,铜粗糙度无关紧要,玻璃编织样式也无关紧要。我们称电介质为“FR-4”,它们的特性…...
MySQL 三大日志:Redo、Undo 与 Binlog 详解
写在前面 关于三大日志,博主看了无数视频和文章,也是总结的非常精辟了! 在 MySQL 数据库的运行机制中,Redo Log、Undo Log 和 Binlog 起着至关重要的作用,它们各司其职,共同保障数据库的数据安全、事务一…...
JMeter-SSE响应数据自动化3.0
背景 此次因为多了一些需要过滤排除的错误(数量很少),还需要修改下JMeter的jtl文件输出数据(后续统计数据需要) 所以只涉及到JSR脚本的一些改动(此部分改动并不会影响到JMeter的HTML报告) 改动 主要通过设置JMeter中prev输出数据变量threadN…...
C#上位机通过WebApi访问WinCC
在智能工厂架构中,WinCC作为SCADA一级,负责着与上级MES和下级PLC及其他现场组件的联系。与下层通信,WinCC支持S7、MC、Modbus TCP、OPC等多种接口和协议。对上层通信,WinCC从7.5 SP2开始支持REST Api这种Web接口方式。 今天跟大家…...
【深度学习新浪潮】什么是端侧AI?
什么是端侧AI? 端侧AI的定义 端侧AI(Edge AI)是指在终端设备(如手机、智能家居、穿戴设备等)本地运行的人工智能技术,无需将数据上传至云端服务器,直接在设备端完成数据处理、模型推理和决策。其核心优势在于低延迟、高隐私性、减少网络依赖,尤其适合对实时性和数据安…...
Postman 的 Jenkins 管理 - 自动构建
目录 一、环境准备 创建 Postman 集合和环境 二、postman Postman 集合和环境并导出 1. 打开已完成并测试无误的 postman 项目脚本。 再次执行测试。 编辑2. 导出( 测试用例集、环境变量 两个文件)**“不 支 持 中 文”** —— 全部改成英文&a…...
HomeBrew MAC PRO 安装教程
1、检查xcode工具 这个东西一般是有的,命令后输入以下内容即可 xcode-select --install如安装,结果为: 2、安装HomeBrew 方式1(推荐) /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebr…...
多模态大语言模型arxiv论文略读(129)
Task Success Prediction for Open-Vocabulary Manipulation Based on Multi-Level Aligned Representations ➡️ 论文标题:Task Success Prediction for Open-Vocabulary Manipulation Based on Multi-Level Aligned Representations ➡️ 论文作者:M…...
Android 实现 Toast 显示重叠问题,有效提升用户体验
Android 实现 Toast 显示重叠问题 在 Android 开发中,Toast 是一个非常常用的提示工具,能够为用户提供短暂的信息展示。然而,Toast 的默认实现中,存在一个体验上的问题,当多次触发 Toast 显示时,会导致多个…...
Spring Boot + MyBatis + Vue:构建高效全栈应用的实战指南
一、项目需求分析 假设我们需要开发一个简单的任务管理系统,用户可以通过该系统创建、查看和删除任务。以下是项目的基本需求: 用户管理:用户可以注册和登录系统。 任务管理:用户可以创建、查看和删除任务。 数据持久化&#x…...
语音情感识别:CNN-LSTM 和注意力增强 CNN-LSTM 模型的比较分析
摘要: 语音情感识别 (SER) 技术可帮助计算机理解语音中的人类情感,这在推进人机交互和心理健康诊断方面占据了关键地位。本研究的主要目标是通过创新的深度学习模型提高 SER 的准确性和泛化性。尽管它在人机交互和心理健康诊断等各个领域都很…...
Cursor Pro取消500次请求限制,无限用的体验更好了吗?
目录 前言 一、发生了什么?从"限量"到"无限"的升级 1.1 "顶配" Ultra 套餐的登场 1.2 Pro 套餐的"静默升级" 1.3 新旧方案对比 二、"无限"背后的体验:一个开发者的真实感受 三、Cursor 为何要…...
视频汇聚EasyCVR平台v3.7.2发布:新增全局搜索、播放器默认解码方式等4大功能
EasyCVR视频汇聚平台带着全新的v3.7.2版本重磅登场!此次升级,绝非简单的功能堆砌,而是从用户体验、操作效率以及系统性能等多维度进行的深度优化与革新,旨在为大家带来更加强大、稳定且高效的视频监控管理体验。 一、全局功能搜索…...
2025年AI热潮:开发一款聚合AI系统,包含AI对话、视频、数字人、办公、客服、剪辑为一体的ai智能系统有多强
前言,我们了解了网上比较火的ai平台,比如: 抖音豆包AI、百度AI、阿里巴巴AI、腾讯AI、华为AI、DeepSeek、ChatGPT、文心一言、通义千问 一、系统概述 本聚合AI系统是一个集AI对话、图片生成、视频生成、视频剪辑、数字人创作、音乐制作、办公…...
DeepSeek 助力 Vue3 开发:打造丝滑的日历(Calendar),日历_项目里程碑示例(CalendarView01_22)
前言:哈喽,大家好,今天给大家分享一篇文章!并提供具体代码帮助大家深入理解,彻底掌握!创作不易,如果能帮助到大家或者给大家一些灵感和启发,欢迎收藏关注哦 💕 目录 Deep…...
AWS数据库迁移实战:本地MySQL零停机上云方案
一、迁移场景 本地环境:自建MySQL 5.7(数据量500GB),业务要求迁移停机时间<5分钟 目标架构: 二、迁移四步法 步骤1:环境准备(耗时30分钟) 1.1 创建Aurora MySQL # AWS CLI创…...
windows汇编
今天发现一个很好的视频,讲windows汇编/调试等。是个老太太讲的,但是讲的真好。 Create/Assemble/Link x64 Windows asm exe, Debugging Tools for Windows (WinDbg), stack shadow store. 照例边看边记录边实验。 1. install visual studio 2. instal…...
用 python 开发一个可调用工具的 AI Agent,实现电脑配置专业评价
在人工智能时代,AI Agent凭借其强大的任务处理能力,逐渐成为开发人员手中的得力工具。今天,我们就来一起动手,用Python打造一个能够调用工具的AI Agent,实现根据电脑信息对电脑配置进行专业评价的功能。 一、项目创建…...
Java自定义线程池(ThreadPoolExecutor)
Java线程池使用示例 下面将展示如何使用自定义线程池(ThreadPoolExecutor)来执行任务,包括提交Runnable任务、Callable任务,处理拒绝策略以及关闭线程池。 import java.util.concurrent.*;public class ThreadPoolDemo {// 自定义线程工厂(…...
386. 字典序排数
386. 字典序排数 理解题目要求 题目要求我们生成从 1 到 n 的整数的字典序排列,并且要求: 时间复杂度 O(n):不能使用直接排序(通常指的是使用标准的排序算法(如快速排序、归并排序、堆排序等)对数…...
Kaggle-Plant Seedlings Classification-(多分类+CNN+图形处理)
Plant Seedlings Classification 题意: 就是给出很多图片,预测出图片中的小草是什么类型的。 数据处理: 1.去除图片背景,只保留物体。 2.图片数据加强。 建立模型: 1.CNN的Sequential(),多层卷积块和…...
Android 应用多语言与系统语言偏好设置指南
文章目录 创建语言包以中文包为例 以系统为主导的“应用语言偏好设置”从你的应用调到“应用语言偏好设置” 创建语言包 我们可以使用一个很蹩脚的办法来实现: 以中文包为例 values是默认values-zh-rCN是简体中文values-zh-rTW是繁体(台湾省ÿ…...
Excel学习01
Excel是微软公司开发的一款电子表格软件,可以广泛应用于数据处理、统计分析、图表制作、财务管理和自动化办公领域等。Excel在实际工作中使用的非常广泛,为此本次开始针对excel的使用进行一系列讲解。 展示使用的软件是WPS,它和excel的使用方…...
Loggers 配置解析(log4j.xml)
Loggers 配置解析 我们通过下面的例子来理解 log4j 的 Loggers 配置是如何决定日志输出规则的。 <Loggers><!-- 根Logger:全局配置 --><Root level"debug"><AppenderRef ref"consoleAppender" level"info"/&g…...
Matplotlib 绘图库使用技巧介绍
目录 前言 Matplotlib 简介 快速入门 图形结构解剖 常用绘图函数 子图与布局 单行多列子图: 网格布局: 自定义位置: 样式与标注 中文字体与科学计数 图例、网格、坐标轴 动态图与动画 三维绘图 常见问题与技巧 前言 Matplotli…...
服务器如何从http升级到https(nginx)
1.证书申请 可以到阿里云或者华为云去申请证书,申请完下载证书是个压缩包,然后解压 可以到到几个文件夹,找到 .Nginx 文件夹打开 会有两个文件,将这两个文件上传至nginx/conf/cert文件夹下(cert需要手…...
解决戴尔电脑No bootable devices found问题
解决戴尔电脑No bootable devices found问题 一、调整BIOS设置 1、在关机状态下,打开计算机电源,在出现 Dell 徽标时按 F2 键以引导至 BIOS 设置菜单。 2、选择 Boot sequence(引导顺序 )并将选项从 Legacy(传统 &…...
FPGA基础 -- Verilog 行为级建模之条件语句
Verilog 的行为级建模(Behavioral Modeling)中的条件语句(Conditional Statements),逐步从基础到实际工程应用,适合有RTL开发基础但希望深入行为建模的人。 一、行为级建模简介 行为级建模(Beh…...
最大公约数
题目描述 输入两个正整数a,b,求a,b的最大公约数。 输入 输入正整数a和b,中间用空格隔开 输出 输出最大公约数 样例输入 144 84样例输出 12程序分析 :运用辗转相除法(欧几里得算法) 用较大数除以较小数,取余数;…...
springboot入门之路(一)
文章目录 1.Spring Boot介绍2.开发你的第一个Spring Boot应用2.1创建POM2.2yml和properties的配置区别yml配置properties配置 2.3springbootDemo代码2.4创建一个可执行jar 参考文档:SpringBoot参考指南;SpringBoot实战 1.Spring Boot介绍 Spring Boot使…...
vue | vue 插件化机制,全局注册 和 局部注册
组件插件化:提升组件的可复用性、扩展性和独立性 组件插件化实现方式 ├── 注册机制 │ ├── 全局注册(app.use)→ install, 循环注册, 配置项 │ └── 局部注册(import components) │ ├── 插件化能力…...
技术与情感交织的一生 (八)
目录 融合 东西厂公 接风宴 头痛 “巴巴罗萨” 突击 推进 助攻 96小时 寒冬 食堂 反攻 消耗 Delphi 西厂 内困 外患 “敦刻尔克” 多线作战 大撤退 资源 融合 东西厂公 初次来到纸箱厂,是主厂区,感觉很大,相对西面正在…...
基于python的web系统界面登录
#让我们的电脑可以支持服务访问 #需要一个web框架 #pip install Flask from flask import Flask, render_template,request from random import randint app Flask(__name__) app.route(/index) def index():uname request.args.get("uname")return f"主页&am…...
利用Java进行验证码的实现——算数验证码
我主要使用使用 Java Swing 库创建一个 GUI 窗口,然后在窗口中显示生成的算术验证码图片,并提供一个文本框和一个按钮,输入验证码并验证显示结果。 代码如下: package calculate; import javax.swing.*; import java.awt.*; imp…...
OpenStack入门体验
1.1云计算概述 相信大家都听到很多的阿里云、腾讯云、百度云等等这些词,那到底什么是云计算?云 计算又能做什么? 1.1.1什么是云计算 云计算(cloud computing)是一种基于网络的超级计算模式,基于用户的不同需求,提供所需的资源,包括计算资源、存储资源、网络资源等。云计算…...
实时中值滤波 + 低通滤波 示例程序(STM32环境)
一、功能概述 本示例实现两个滤波器: 中值滤波器(Median Filter):对短期异常值(如尖峰噪声)有良好的抑制能力;低通滤波器(Low-Pass Filter):对数据进行平滑…...
AppBarLayout+ CoordinatorLayout,ViewPager2为什么不会覆盖AppBarLayout
<?xml version"1.0" encoding"utf-8"?> <layout xmlns:android"http://schemas.android.com/apk/res/android"xmlns:app"http://schemas.android.com/apk/res-auto"xmlns:tools"http://schemas.android.com/tools&quo…...
C语言——枚举
目录 一、枚举的基本概念 1. 定义与语法 2. 枚举变量的声明 二、枚举的特性 1. 整型常量的本质 2. 作用域规则 3. 内存占用 三、枚举的使用场景 1. 替代宏定义常量 2. 状态机实现 3. 函数返回值类型 四、枚举与其他类型的对比 五、高级技巧与注意事项 1. 位掩码枚…...
148. 排序链表
题目: 给你链表的头结点 head ,请将其按 升序 排列并返回 排序后的链表 。 示例1: 解题思路: 这道题是一道综合题,考察了链表中间节点合并有序链表。首先我们链表中间节点,然后从中间结点的前一个节点处断…...
26.【.NET8 实战--孢子记账--从单体到微服务--转向微服务】--单体转微服务--角色权限管理
在现代企业级应用中,角色权限管理是保障系统安全和提升用户体验的核心基础功能。一个高效的角色权限系统不仅能够有效防止越权访问,还能简化系统的维护和扩展。本文将系统性介绍角色权限管理的核心实现思路,包括架构设计、性能优化、安全机制…...
flowable查询最新定义的流程梳理
背景。使用ruoyi-flowable-plus进行二次开发。将项目与流程绑定后查询相关流程表单时发现问题。于是梳理逻辑汇总了下面的思维导图和相关代码。查询逻辑。流程定义Key 最流程新版本(orderByProcessDefinitionVersion) 取第一条流程实例 最新的一条版本记录。这里一定要用流程…...
kafka消费的模式及消息积压处理方案
目录 1、kafka消费的流程 2、kafka的消费模式 2.1、点对点模式 2.2、发布-订阅模式 3、consumer消息积压 3.1、处理方案 3.2、积压量 4、消息过期失效 5、kafka注意事项 Kafka消费积压(Consumer Lag)是指消费者处理消息的速度跟不上生产者发送消息的速度,导致消息在…...
基于多模态文档解析与RAG的行业知识库构建技术指南
1. 技术背景 随着企业非结构化数据(扫描件、PDF、图像等)占比超过80%,传统关键词检索已无法满足精准问答需求。本文提出融合**计算机视觉(CV)与大语言模型(LLM)**的解决方案,关键技…...
UVa1408/LA4018 Flight Control
UVa1408/LA4018 Flight Control 题目链接题意分析AC 代码 题目链接 本题是2007年icpc亚洲区域赛成都赛区的F题 题意 有一个N行M列的数组(1 ≤ N ≤ 50, 1 ≤ M ≤ 9)记录机场各个航班的飞行传感数据,其每个元素都是整数。如果某元素小于等于0,则其一定不…...
【STM32 HAL库】使用HAL库操作FLASH
操作顺序 先解锁Flash,再擦除片区,再写入,写完了别忘了加锁。 HAL_FLASH_Unlock(); HAL_FLASHEx_Erase(); HAL_FLASH_Program(); HAL_FLASH_Lock();擦除操作 首先有个问题,我们为什么要擦除,不能直接覆写吗…...
【学习笔记】2.2 Encoder-Decoder
参考资料:https://github.com/datawhalechina/happy-llm 在 Transformer 中,使用注意力机制的是其两个核心组件——Encoder(编码器)和 Decoder(解码器)。 2.2.1 Seq2Seq 模型 Seq2Seq(序列到…...
批量创建tmux tmux批量
目录 获取空进程 tmux 获取空进程tmux并关闭 批量创建tmux 批量创建tmux 设置CUDA_VISIBLE_DEVICES: python 读取CUDA_VISIBLE_DEVICES 获取空进程 tmux for session in $(tmux ls -F #S); dopid=$(tmux list-panes -t "$session" -F "#{pane_pid}"…...
7.索引库操作
mapping映射属性 mapping是对索引库中文档的约束 常见的mapping属性包括: type 字段数据类型,常见的简单类型有: 字符串:text(可分词的文本) keyword(精确值,例如:品牌、国家,ip地址) 数值&…...