HashMap底层原理与面试深挖:哈希、扩容、红黑树与并发安全
面试官一旦开始问Map基本意味着技术面已经从“你会不会写代码”进入“你到底懂不懂数据结构”的阶段。我经历过不少次这种追问最直观的感受是几乎所有候选人都能背出“数组加链表加红黑树”这句话但真正能接住后续连环问的人十个里面未必有两个。这篇是面试准备系列第七篇把Map数据结构放到面试场景里完整过一遍从底层哈希原理到扩容细节从线程安全方案到自定义对象的坑再到面试里最高频的手撕题希望对准备跳槽或者正在复习基础的朋友有帮助。1. 开场命题面试官问Map到底在考察什么1.1 一句背出来的答案换来的往往是连环追问“你说一下HashMap的底层实现。”这种问题我见过太多次了标准答案谁都会“1.8以后底层是数组加链表加红黑树链表长度超过8并且数组长度超过64会转成红黑树。”很多候选人说完这句话就停住了以为这题过了。面试官往往会接着问“那为什么链表长度超过8就转红黑树这个8是拍脑袋定的吗为什么数组长度不够64的时候不转转成红黑树之后就一劳永逸了吗”这一串问题下来十个候选人里能答明白两三个就算不错了。原因很简单如果你只是背了结论没有真正读过源码、推过概率这些“为什么”根本接不住。而Map这个数据结构天然适合做深挖题因为它把哈希函数设计、冲突处理策略、动态扩容机制、并发安全方案、面向对象设计揉在一起任何一个点都能拆成一串问题。1.2 Map为什么能成为数据结构的试金石从面试官的角度看Map是少有的“一层一层往下挖”的话题。第一层看你知不知道基本用法第二层看你懂不懂哈希原理第三层看你能不能说出设计权衡第四层看你是否关心版本演进和并发场景。每一层都在筛选不同水平的人。理解Map核心逻辑可以拿图书馆查书来类比你要找一本书不需要把整个图书馆翻一遍而是先根据分类号定位到某个书架再在书架上逐本比对。对HashMap来说哈希函数负责把“分类号”算出来数组就是那一排书架链表和红黑树是书架上可能挂着的多本书。这个类比能帮你理解后面所有细节——为什么哈希函数决定效率下限为什么碰撞处理决定极端情况表现为什么扩容是新造一个更大的图书馆再搬书。下面按面试官常用的提问路径把Map完整拆一遍。2. HashMap的底层进化从数组链表到红黑树的权衡2.1 数组是骨架哈希函数决定数据放哪先看HashMap最核心的存储结构。在JDK 1.8中底层是一个NodeK,V[] table数组每个元素叫桶bucket。当你执行put(key, value)的时候并非直接把键值对塞进数组而是经过两步定位// 第一步对key的hashCode做扰动 static final int hash(Object key) { int h; return (key null) ? 0 : (h key.hashCode()) ^ (h 16); } // 第二步用数组长度减一与hash做与运算得到桶下标 index (n - 1) hash这里有两个细节面试官特别爱问。第一个问题是“为什么计算下标要用(n - 1) hash而不是hash % n”答案的关键在于HashMap的数组长度始终是2的幂。当n是2的幂时n - 1的二进制全是低位1比如n16时n-115二进制是1111。这时(n - 1) hash等价于hash % 16但位运算比取模快得多。这是HashMap选择2的幂作为容量的根本原因。第二个问题是“扰动函数h ^ (h 16)有什么用”因为(n - 1) hash只保留hash的低位如果两个key的hashCode在高位上不同、低位恰好相同它们就会撞到同一个桶。扰动函数把高16位“揉”进低16位让高位信息也参与下标计算从而在数组还很小的时候就能尽量打散数据。JDK 1.7里有四次扰动1.8简化成一次原因是现代CPU的计算速度提升后一次就够用了。2.2 链表兜底碰撞简单但最坏情况是灾难不管哈希函数怎么设计碰撞总是可能的。两个不同的key算出同一个桶下标HashMap的处理策略是拉链法在这个桶位置挂一个链表新来的节点追加到链表尾部。平均情况下每个桶里的元素很少查找近似O(1)。但最坏情况非常致命如果哈希函数设计得很烂或者key本身有规律地撞在一起所有元素都堆进同一个桶链表长度变成n查找退化成O(n)。这个复杂度对一个以“快速查找”为存在意义的数据结构来说是不可接受的。所以JDK 1.8引入了红黑树当链表长度超过阈值就把链表转换成红黑树让查找复杂度从O(n)降到O(log n)。在数据量大的时候这个差距是数量级的——一百万条数据的链表查找最多要扫一百万次红黑树只需要大约20次。2.3 为什么是8和64泊松分布的概率逻辑这里就是区分“背答案”和“真懂”的分水岭为什么偏偏是8答案在源码注释里写得明明白白JDK作者用泊松分布做过一次概率推演。假设负载因子是默认的0.75在理想随机哈希的情况下一个桶里出现k个元素的概率服从泊松分布计算公式是(e^-0.5 * 0.5^k / k!)。我直接贴一下关键数值链表长度概率00.6065306610.3032653320.0758163330.0126360640.0015795250.0001579560.0000131670.0000009480.00000006也就是说在装卸因子0.75、哈希足够随机的前提下一个桶里出现8个节点的概率是千万分之六。到了这个程度基本可以认为碰撞不是随机因素引起的而是某种恶意的哈希攻击或者key设计有问题。此时转成红黑树来抵抗最坏情况是合理的防御性设计。至于“为什么数组长度必须达到64才转树”是因为当数组很小的时候与其转树不如先扩容。扩容后所有元素重新分布原来的长链表往往会被自然拆散等于以更低的成本解决了碰撞问题。源码里的逻辑是链表长度达到8时先检查数组长度如果小于64就扩容否则才树化。反转过来也一样红黑树在节点数降到6以下时会退化成链表这中间留下8到6的“缓冲”避免频繁在树和链表之间来回切换消耗性能。3. 扩容与哈希碰撞两处最容易翻车的细节3.1 扩容时机threshold阈值背后的权衡HashMap不是无限往数组里塞数据的。它有一个关键字段threshold计算公式是容量 * 负载因子。默认容量16、默认负载因子0.75所以threshold是12。当元素个数超过12就触发扩容新容量直接翻倍变成32。面试官在这里一定会追问“负载因子为什么是0.75为什么不是0.5不是1.0”这个问题没有标准背法核心是空间和时间的权衡。负载因子越小阈值越低扩容越频繁空间浪费越多但桶内元素越少查找越快。负载因子越大空间利用率越高但碰撞概率越大查找越慢。0.75是工程实践里一个经过大量测试的折中点以16的初始容量和默认负载因子来看空间利用率四分之三左右冲突率控制得比较理想。面试时你能说出“这是时间与空间的折中并且和泊松分布的推导一起配合使用”就已经超出大多数候选人了。另外要注意扩容时数组长度翻倍必须保持2的幂否则前面说的位运算下标公式就失效了。这也是为什么HashMap的容量调整永远是在“翻倍”而不是随意加几个。3.2 JDK 1.7和1.8扩容的最大区别头插法与尾插法这是一个非常经典的“版本差异”考点。JDK 1.7的HashMap在扩容迁移元素时用的是头插法从原链表头部开始遍历逐个把节点重新插入到新数组对应桶的头部。这样可以“原地反转”链表代码写起来短但埋了一个大雷并发环境下两个线程同时扩容可能形成循环链表。一旦循环链表形成后续任何查询操作都会陷入死循环CPU直接打满服务卡死。JDK 1.8改成尾插法遍历旧链表时把节点按原顺序追加到新链表尾部。这避免了链表成环的问题也让扩容后的链表保持原有的相对顺序。但注意这不代表1.8的HashMap是线程安全的——并发put仍然可能丢数据只是不会出现死循环这种“显性崩溃”。面试时如果能把“1.7头插法为什么会成环、1.8尾插法为什么解决这个问题”讲清楚面试官基本能确认你不是只会背概念。3.3 1.8扩容的高位优化一条链表拆成两条链JDK 1.8扩容还有一个非常漂亮的优化值得单独拿出来说。扩容后数组长度从n变成2n元素的桶下标需要重新计算。但JDK 1.8不是简单地重新走一遍哈希而是利用了一个数学性质因为新容量是旧容量的两倍等价于旧容量的二进制高位多了一个1。对于任何一个hash值新的下标要么是原下标要么是原下标 旧容量。判断依据就是这个hash值的第log2(n)位是0还是1。源码里直接用(e.hash oldCap) 0来判断为0的留在原下标不为0的移到“原下标 oldCap”的位置。整个过程只需要遍历旧链表一次就能拆成两条新链效率极高还避免了每个元素重新计算下标的开销。这个点是典型的“源码级”考点。你能在白板上把这个逻辑画出来并且说明“为什么oldCap能用位运算判断新位置”说明你真正读懂了扩容机制而不是只知道“翻倍扩容”四个字。4. 线程安全的Map战场从Hashtable到ConcurrentHashMap4.1 Hashtable的笨办法一把锁锁住整张表面试官问完HashMap的底层下一个问题几乎必然落到并发上“HashMap线程安全吗不安全那想要线程安全怎么办”最早的答案是Hashtable。它的做法简单粗暴所有方法都加synchronized也就是整个Map共用一把锁。同一时刻只有一个线程能执行put或get。这样做线程安全是安全了但并发度几乎为零多个线程读同一个Map都要排队。在互联网高并发场景下这种方案基本没法用。还有一个小知识点Hashtable不允许null键和null值而HashMap允许一个null键这一点也常被问。4.2 ConcurrentHashMap 1.7分段锁与并发度的提升JDK 1.7的ConcurrentHashMap用了分段锁Segment的思想。它把整个Map分成多个Segment每个Segment本身是一个小型的Hashtable继承自ReentrantLock。put操作只需要锁住目标元素所在的Segment其他Segment依然可以并发读写。默认并发级别concurrencyLevel是16也就是最多16个线程同时写不同Segment而互不阻塞。读操作则大多不加锁通过volatile保证可见性。这比全局锁有了质的提升也是面试里“锁粒度”这个概念最经典的例子。4.3 ConcurrentHashMap 1.8锁粒度细化到桶JDK 1.8的ConcurrentHashMap又往前走了一步直接放弃了Segment采用CAS synchronized的细粒度并发方案。put一个元素时如果目标桶为空就通过CAS无线程阻塞地把节点放进去如果桶不为空则对桶的头节点加synchronized锁锁粒度从“一段”细化到“一个桶”。同一数组上不同桶的写入可以真正并发执行并发度大大提高。面试官在这里会追问“1.8为什么不用ReentrantLock而回头用synchronized”这个问题要结合JVM的发展来回答现代JVM对synchronized做了大量优化包括偏向锁、轻量级锁、锁升级机制在锁竞争不激烈时synchronized的性能已经不输ReentrantLock而且synchronized不需要手动释放锁代码更简洁不容易出错。更重要的是ConcurrentHashMap锁的是桶的头节点锁粒度已经足够小Segment这种“先定位段再锁段内”的两级结构反而显得冗余了。如果面试时你能说出“锁升级”“偏向锁到重量级锁”这些词说明你对JUC和JVM都有涉猎这是加分项。5. equals和hashCode自定义Key的隐藏连环坑5.1 约定失衡Map就找不到你的数据Map面试里有一类问题专门围绕equals和hashCode展开而且特别爱用自定义对象当Key来出题。很多人写代码时用User、Order这类对象直接做Key结果查询返回null查了半天不知道原因。根源在于Java的约定如果两个对象通过equals比较相等那么它们的hashCode必须相等反过来hashCode相等不代表equals相等。HashMap定位元素的逻辑是“先比hash定位桶再在桶里用equals比对”如果两个相等的对象hashCode不同它们会被分配到不同的桶equals根本没有被调用的机会get自然找不到。所以自定义对象作为Key必须同时重写equals和hashCode且hashCode的生成逻辑必须建立在参与equals比较的字段上。这个约定不是HashMap独有的HashSet、HashTable、ConcurrentHashMap全部依赖这一条。5.2 可变对象当Key最常见的隐性Bug比不重写更隐蔽的坑是用可变对象做Key。假设你自定义了一个类hashCode根据某个字段计算class Order { private int status; Override public boolean equals(Object o) { if (this o) return true; if (o null || getClass() ! o.getClass()) return false; Order order (Order) o; return status order.status; } Override public int hashCode() { return Objects.hashCode(status); } }你把一个status为1的Order对象放进HashMap之后改成了2。这个对象还在桶里但它计算hash码时用的字段已经变了。再次get这个对象时新hash算出的桶下标和原来存进去时的桶下标很可能不同于是返回null。更麻烦的是这个“孤儿”条目会一直留在Map里占用内存永远无法通过正常手段访问到除非手动清空整个Map。我建议在实际项目中凡是用作Key的对象尽量设计成不可变类所有字段final不提供任何修改方法。如果实在需要可变Key记住一个铁律放进Map之后绝对不能再改它的hash相关字段。这个问题在面试里几乎演变成了标配连环题“如果两个对象的hashCode相同会怎样如果equals相同hashCode不同又会怎样”前者是碰撞后者是违约答案完全不在一个层次上。5.3 一道常见的连环追击题面试官可能会拿String做例子来追击“String为什么适合做Key”因为String是不可变的hashCode被缓存每次哈希只需计算一次效率高且值绝对不会中途改变。然后他会反问“如果我用一个列表List做Key会怎样”List的hashCode由元素决定元素可变放进Map后一旦修改List内容查找就彻底失效。这类问题完全没有死记硬背的必要只要你理解了“Map的定位依赖key的哈希值而哈希值的稳定依赖于key的不变性”所有变体都能举一反三答出来。6. 实战高频追问LinkedHashMap、TreeMap与场景题6.1 LinkedHashMap双向链表与LRU缓存实现面试聊完HashMap通常会顺势问你“有没有有序的Map”LinkedHashMap就是答案。它在HashMap基础上额外维护了一条双向链表记录每个Entry的插入顺序或访问顺序。构造方法里传入accessOrder true时它会在每次get之后把被访问的节点移动到链表末尾从而形成“按访问时间从旧到新排列”的效果。经典考点是基于LinkedHashMap手写一个LRU最近最少使用缓存。核心就两步继承LinkedHashMap重写removeEldestEntry方法并在里面判断当前容量是否超过预设上限class LRUCacheK, V extends LinkedHashMapK, V { private final int maxCapacity; public LRUCache(int capacity) { super(capacity, 0.75f, true); this.maxCapacity capacity; } Override protected boolean removeEldestEntry(Map.EntryK, V eldest) { return size() maxCapacity; } }这里有一个容易被问到的细节构造时的初始容量应当设置为capacity / 0.75 1避免中途扩容带来的性能损耗。还要说明get方法本身会移动节点顺序这是“访问后刷新”的关键。需要提醒的是LinkedHashMap默认不是线程安全的并发LRU需要再用Collections.synchronizedMap包装或者采用Double Checked Locking等方案扩展。手撕这道题时能主动说出“为什么用accessOrder而不是自己记录时间戳”说明你理解LinkedHashMap的设计意图而不是抄代码。6.2 TreeMap红黑树与有序操作如果说HashMap是“以哈希换速度”TreeMap就是“以有序换功能”。它的底层是一棵红黑树Key必须实现Comparable接口或者在构造时传入Comparator。作为回报它支持一系列HashMap完全做不到的操作firstKey()、lastKey()、floorKey(key)小于等于给定key的最大key、ceilingKey(key)大于等于给定key的最小key、subMap(fromKey, toKey)范围查询等。面试中关于TreeMap的高频问题是“红黑树的查找复杂度是多少插入和删除的复杂度呢”答O(log n)。追问“红黑树和AVL树的区别是什么为什么HashMap用红黑树而不是AVL树”核心区别在于平衡策略AVL是严格平衡树高更低但旋转次数多红黑树是近似平衡允许左右子树高度差一倍旋转次数少。对于HashMap这种“以插入删除为主、偶尔需要树化承担压力”的场景红黑树的写操作成本更可控。能讲清这点说明你对数据结构本身的取舍有理解而不只是会背“红黑树五条性质”。6.3 两道必练的Map手撕题Map相关的算法题在面试中命中率极高。我给出两道我真实遇到过、几乎每家都考的题建议手写并逐行讲清楚。第一道是经典的“两数之和”变体给定一个整数数组找出和为target的两个数返回下标。用Map把“数值 - 下标”存起来遍历一遍即可public int[] twoSum(int[] nums, int target) { MapInteger, Integer map new HashMap(); for (int i 0; i nums.length; i) { int complement target - nums[i]; if (map.containsKey(complement)) { return new int[]{map.get(complement), i}; } map.put(nums[i], i); } return new int[]{-1, -1}; }很多人在此题上犯的错误是先一口气把所有元素放进Map再回头找这样遇到重复元素时下标会被覆盖。正确的做法是边遍历边查询边放入保证每个元素最多比较一次。笔试时写对不难但面试官往往会加问一句“时间复杂度为什么是O(n)”“如果有序数组还有什么办法”后者可以引出双指针前后呼应。第二道是“字符串中第一个不重复的字符”变体给定字符串找出第一个出现次数为1的字符。用LinkedHashMap可以边统计边保留顺序public char firstNonRepeatingChar(String s) { MapCharacter, Integer countMap new LinkedHashMap(); for (char c : s.toCharArray()) { countMap.put(c, countMap.getOrDefault(c, 0) 1); } for (Map.EntryCharacter, Integer entry : countMap.entrySet()) { if (entry.getValue() 1) { return entry.getKey(); } } return ; }如果第一次遍历用普通HashMap第二次再遍历原字符串找第一个计数为1的字符也是可以的少依赖LinkedHashMap的特性。两种写法都值得练一遍因为面试官会问你为什么要维护顺序这时你就能顺便展示对LinkedHashMap的理解。最后聊两句学习上的体会。我自己刷这块内容时最有效的方法是把源码里几个关键方法从头到尾读三遍第一遍看流程第二遍看为什么这样做第三遍合上电脑自己讲给自己听。面试里那些看似刁钻的问题比如“为什么是8”“为什么用位运算”“为什么1.8改用尾插法”全部藏在源码注释和历史提交记录里。读懂之后你会发现Map并不是什么黑魔法它只是一堆严谨的工程决策堆叠出来的产物。把这些决策背后的权衡想明白比记住任何结论都重要。

相关新闻

碰碰好评卡功能开发实战指南 核心逻辑梳理与落地方法全解析

碰碰好评卡功能开发实战指南 核心逻辑梳理与落地方法全解析

碰碰好评卡功能开发实战指南 核心逻辑梳理与落地方法全解析 在本地生活、电商、上门服务等业务场景中,好评卡是提升用户评价意愿、优化商家口碑的核心运营工具。碰碰好评卡作为轻量化的评价激励组件,能够实现订单完成后的自动触发、好评内容智能校验、权…

2026/10/15 12:10:44 阅读更多 →
智能仓储物料管理系统

智能仓储物料管理系统

针对传统仓储物料人工盘点效率低、多终端并发操作易引发库存数据异常、仓储环境管控难等痛点,基于i. MX6ULL嵌入式Linux平台,独立开发分布式智能物料管理系统。构建“终端采集-边缘网关-后台管理平台”三层架构,实现温湿度 / 光照采集、人员入…

2026/10/15 12:10:44 阅读更多 →
HALCON图像预处理全解析:灰度变换、滤波与背景校正实战指南

HALCON图像预处理全解析:灰度变换、滤波与背景校正实战指南

最近在啃《HALCON机器视觉与算法原理编程实践》这本书,第5章图像预处理让我有点上头。之前做视觉项目,我习惯拿到图就开阈值,结果检测率忽高忽低,后来花了很长时间才发现问题不在分割算法,而在预处理阶段——噪声、光照…

2026/10/15 12:09:25 阅读更多 →

最新新闻

人脸特征提取三路线:HoG、Dlib与CNN原理及选型指南

人脸特征提取三路线:HoG、Dlib与CNN原理及选型指南

人脸识别这几年从实验室走向了门禁、考勤、相册聚类、甚至手机解锁,几乎成了计算机视觉里最"接地气"的方向之一。但真到动手做项目的时候,很多人会卡在同一个地方:特征到底怎么提?我见过不少朋友一上来就堆深度学习模型…

2026/10/15 13:00:25 阅读更多 →
校园失物招领系统

校园失物招领系统

文章目录前言项目简介项目背景技术栈系统架构核心功能截图后台管理公告管理认证授权认领管理评论收藏失物招领信息消息用户管理首页失物列表发布信息我的发布个人中心核心技术实现项目亮点项目总结项目下载:前言 项目简介 面向高校校园场景的前后端分离 Web 应用&a…

2026/10/15 13:00:25 阅读更多 →
基于4D关联图的多相机实时多人动作捕捉技术解析

基于4D关联图的多相机实时多人动作捕捉技术解析

1. 从"多相机多人动捕"这个硬骨头说起第一次看到"4D Association Graph"这个名词的时候,我正蹲在一个临时搭建的动作捕捉棚里,面对八台同步相机拍出来的画面发愁。画面里三个人在互相传球,手臂交叠、身体遮挡、快速移动&…

2026/10/15 13:00:25 阅读更多 →
SSM在线作业管理系统:从选题到答辩的全链路解析

SSM在线作业管理系统:从选题到答辩的全链路解析

又到了一年毕业设计选题季,后台私信里反复被同一个关键词轰炸:SSM在线作业管理系统。实话说,这个题在计算机毕业设计里属于"经典中的经典",每年都有大量学生选它,但真正能讲清楚"为什么这么设计、每一步…

2026/10/15 13:00:25 阅读更多 →
Network Kit HTTP:三方库版本清单ETag重验证与离线快照保底【鸿蒙心迹】

Network Kit HTTP:三方库版本清单ETag重验证与离线快照保底【鸿蒙心迹】

场景说明: 本文 ManifestHarbor 的 MH-1421、v17、8 个依赖项、ETag "ohpm-v17"、304 响应与 HiLog 均为受控演示数据。示意图不是 DevEco Studio、真机或真实服务器的测试结果;代码依据公开 Network Kit API 设计,尚未在实际 Harm…

2026/10/15 13:00:25 阅读更多 →
Hyper-Frames:无标签视频+里程计自监督预训练,实现低成本运动预测

Hyper-Frames:无标签视频+里程计自监督预训练,实现低成本运动预测

做自动驾驶、移动机器人、无人机导航的同行,应该都有一段被数据集标注反复折磨的经历。最近 Waymo Research 放出的 Hyper-Frames 框架,让我终于看到一条不太一样的路:不用一开始就堆人天去标框、标轨迹、标地图,用无标签视频加里…

2026/10/15 12:59:25 阅读更多 →

日新闻

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

1. 为什么选择容器化方式部署 LoRa 网络服务LoRa 物联网项目落地时,网络服务器是整个链路的核心枢纽。它负责接收网关上报的数据包、完成去重与解密、再把有效载荷分发给上层应用。早期大家习惯把网络服务器直接装在物理机上,依赖一堆系统库和特定版本的…

2026/10/15 0:00:46 阅读更多 →
共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

1. 共享推理服务里,扩缩容到底难在哪做过大模型推理服务部署的人,大概都经历过这样的场景:一个团队共用一套推理集群,A 业务跑的是 7B 的小模型,B 业务跑的是 72B 的大模型,C 业务白天流量高、晚上几乎归零…

2026/10/15 0:00:46 阅读更多 →
Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

1. 引子:一次内核恐慌引发的追查先从一个真实场景说起。某次我给一台老旧的嵌入式设备折腾系统裁减,为了把启动时间压进两秒以内,我手贱地把一串自认为“没用”的 systemd 服务给 disable 了,其中就包括systemd-remount-fs.servic…

2026/10/15 0:00:46 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/14 3:30:28 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/14 16:30:29 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/14 3:29:58 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 0:14:36 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/14 22:45:47 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 9:49:14 阅读更多 →