遍历时删元素为什么报错:modCount 这个“计数器“在背后盯着你

Java集合容器深度解析:从源码原理到面试实战选型指南 在Java开发中,集合框架是日常编码与面试考察的核心知识模块。无论是ArrayList的扩容机制、HashMap的红黑树优化,还是并发容器的锁粒度演进,其本质都是对数据结构设计与性能取舍的工程实践。理解集合框架从接口抽象到具体实现的层次关系,掌握快速失败机制、哈希扰动函数、负载因子等关键原理,有助于开发者做出合理的容器选型。例如,在涉及大量元素存储时预估容量避免频繁扩容,在并发读写场景下根据读写比例选择ConcurrentHashMap或CopyOnWriteArrayList。集合框架的设计思想还渗透至工 阅读详情

「Java 进阶之路」系列 Day25

写在前面

“遍历集合的时候不能直接调用集合的remove方法”,这条经验大家都知道,但问一句"为什么会报错、报的又是什么异常",很多人只记得一个笼统的印象。这篇把Iterator和fail-fast机制背后的modCount计数器讲清楚,顺便说说这套机制到底能不能完全依赖。


一、是什么:fail-fast 是一种"尽早报错"的检测机制

ArrayList、HashMap这些集合内部都维护着一个modCount字段,记录这个集合被"结构性修改"(增加或删除元素,单纯改值不算)过多少次。Iterator在创建的那一刻,会把当时的modCount记下来,存成自己的expectedModCount;之后每调用一次next(),都会检查一下"当前的modCount是不是还等于我当初记下来的那个值",不相等就说明集合在遍历过程中被别的地方动过手脚,直接抛出ConcurrentModificationException——这就是fail-fast(快速失败)的含义:与其让程序继续在一个被意外修改过的集合上跑下去、产生更难排查的诡异结果,不如第一时间报错,让问题尽早暴露。


二、为什么会报错:一次典型的踩坑复现

List<Integer> list = new ArrayList<>(List.of(1, 2, 3, 4, 5));

for (Integer i : list) {
    if (i == 3) {
        list.remove(i);   // 直接调用集合自身的remove方法
    }
}
// 抛出ConcurrentModificationException

创建Iterator时记录expectedModCount等于当前modCount

遍历过程中调用集合自身的remove方法

集合内部modCount自增

Iterator完全不知道modCount已经变了

下一次调用next时检查modCount是否还等于expectedModCount

不相等 抛出ConcurrentModificationException

问题就出在list.remove(i)这一步:for-each语法糖底层就是用Iterator实现的,但list.remove(i)调用的是ArrayList自己的remove方法,不是Iterator的remove方法。ArrayList的remove执行完之后,modCount自增了,但Iterator手里那份expectedModCount完全不知情、还停留在旧值——下一次Iterator调用next()推进遍历时,一检查发现两者对不上,立刻抛出异常。

正确的做法是用Iterator自己的remove()方法:

Iterator<Integer> it = list.iterator();
while (it.hasNext()) {
    Integer i = it.next();
    if (i == 3) {
        it.remove();   // 用Iterator自己的remove方法
    }
}

Iterator.remove()内部在删除元素的同时,会同步把expectedModCount也更新成最新的modCount,两者始终保持一致,自然不会触发检测。这也是为什么"遍历删除要用Iterator的remove"这条经验背后真正的原理——不是Iterator有什么特殊权限,而是它顺手帮你把这两个计数器的值重新对齐了。


三、怎么用:两个容易被混淆的相关陷阱

陷阱一:用普通下标 for 循环删除元素,不报错但结果不对

List<Integer> list = new ArrayList<>(List.of(1, 2, 3, 4, 5));
for (int i = 0; i < list.size(); i++) {
    if (list.get(i) == 3) {
        list.remove(i);   // 不会抛异常,但结果可能不符合预期
    }
}

这种写法不会抛ConcurrentModificationException(因为压根没用Iterator),但如果删除的元素后面还有连续需要删除的元素,会因为"删除后所有元素前移、下标却继续往后走"而漏检查一个元素——这和fail-fast是两个完全不同的问题,只是经常被放在一起讨论,写代码时要分清楚:用Iterator遍历删除,报的是fail-fast异常;用下标遍历删除,出的是逻辑漏删的bug,两者的成因完全不一样。

陷阱二:fail-fast 只是"尽力检测",不是100%保证

JDK官方文档里对这套机制有一句关键说明:modCount的检查本身不是同步的,多线程场景下即使检测机制生效了,也不能保证一定能捕获到并发修改;反过来,某些边界情况下即使真的发生了并发修改,也可能因为时机凑巧而没有触发检测、蒙混过关。fail-fast只是一种尽最大努力去暴露问题的调试辅助手段,不能把它当成一种可以依赖的并发控制机制去设计代码——真正需要多线程安全遍历的场景,应该用Day08讲过的CopyOnWriteArrayList(遍历用的是创建时的数组快照,天生不会抛这个异常,属于"fail-safe"设计)或者ConcurrentHashMap这类专门为并发设计的容器。


四、面试追问

Q1:什么是 fail-fast 机制,它是怎么实现的?

fail-fast是集合类在遍历过程中检测到被意外结构性修改时,第一时间抛出ConcurrentModificationException的一种保护机制。实现原理是集合内部维护一个modCount字段记录被修改的次数,Iterator创建时记下当时的modCount作为expectedModCount,之后每次调用next()都会比较两者是否相等,不相等就说明遍历期间集合结构被改动过,直接抛出异常。

Q2:为什么在 for-each 循环里直接调用集合的 remove 方法会抛异常,用 Iterator 的 remove 方法就不会?

for-each底层是用Iterator实现遍历的,但直接调用集合自身的remove方法,只会让集合内部的modCount自增,Iterator手里记录的expectedModCount并不知情,两者变得不一致,下次调用next()检测到不一致就会抛异常。Iterator自己的remove()方法在删除元素的同时会同步更新expectedModCount,让两者始终保持一致,所以不会触发这个检测。

Q3:用普通下标 for 循环遍历删除元素,会抛 ConcurrentModificationException 吗?

不会,因为这种写法完全没有用到Iterator,fail-fast检测机制根本没有介入。但这种写法有另一个问题:删除元素后集合会整体前移,而下标却继续往后走,如果有连续多个需要删除的元素,会因为下标错位漏掉其中一部分该删除的元素,这是一个逻辑正确性问题,和fail-fast异常是两回事。

Q4:fail-fast 机制能不能保证百分之百检测到并发修改?

不能。JDK官方文档明确说明modCount的检查本身不是同步的,多线程环境下既可能因为时机原因没有检测到真实发生的并发修改,也不能保证在所有场景下都表现一致。fail-fast只是一种尽力而为的调试辅助手段,不能当作可靠的并发控制机制来设计代码逻辑。

Q5:如果需要在多线程环境下安全地遍历一个集合,应该怎么做?

不应该依赖普通集合的fail-fast机制,而应该使用专门为并发场景设计的容器,比如CopyOnWriteArrayList——它的迭代器遍历的是创建时刻的数组快照,遍历期间即使有其他线程在修改原集合也不会抛异常(fail-safe设计);或者使用ConcurrentHashMap这类内部有精细同步机制的并发容器,具体选择取决于业务场景的读写比例和一致性要求。


下一篇预告

Day26 讲泛型的本质——类型擦除到底擦掉了什么,为什么List<String>和List<Integer>在运行时其实是同一个Class对象,这是模块三集合框架的收官篇。

百度校招Java笔试复盘:从底层原理到工程实践的考点解析 在Java技术体系中,扎实的底层原理与工程实践能力是应对高并发场景的基础。集合框架的HashMap扩容机制、JVM内存模型中的OutOfMemoryError排查,以及数组越界异常处理,都是开发者必须掌握的核心技能。从排序算法到列车调度这样的经典算法题,考察的不仅是编码能力,更是问题建模与优化思维。Spring Boot接口安全对接、Lombok编译问题等实战场景,则进一步体现了技术选型与排障能力。本文围绕百度2023校招Java笔试卷展开复盘,逐层拆解各考点背后的设计逻辑,帮助读者建立理论与实践并重的知识 阅读详情

相关推荐

爱奇艺Java秋招笔试题解析:高频考点与避坑指南

Java后端技术栈中,集合框架、JVM内存管理与并发编程是校招笔试的核心板块,HashMap原理、lambda函数及类加载机制等基础概念直接影响答题稳定性。线上笔试环境往往带来额外挑战:Java版本兼容性、输入输出处理与内存限制常成为失分点,例如本地编译正常的代码可能因目标发行版本不一致而报错,或在大数组场景触发OutOfMemoryError。此外,快速排序、二分查找等算法模板的边界条件掌握程度,决定了编程题的完成质量。爱奇艺等视频类大厂的Java笔试题正是围绕这些高频考点设计,覆盖基础语法、集合、JVM

weixin_34408717的博客 389

孤舟笔记 基础篇十二 集合遍历时删元素就报错?fail-fast 和 fail-safe 到底在保护谁

Java集合的fail-fast和fail-safe机制对比:fail-fast通过modCount计数器检测修改,一旦发现立即抛出ConcurrentModificationException,保证数据强一致性,代表类如ArrayList;fail-safe则通过操作副本实现安全遍历,不会抛异常但可能读到旧数据,具有弱一致性,代表类如CopyOnWriteArrayList。关键区别在于fail-fast直接操作原数据,性能高但严格;fail-safe操作副本,适合并发场景但存在拷贝开销。单线程推荐使用f

学无止境 (专注java,爱好前端) 660

有赞2019校招Java笔试A卷盘点:从基础语法到高并发核心考点

Java基础是后端开发的立足之本,尤其在电商SaaS这类高并发场景下,扎实掌握集合框架、并发编程与JVM原理,直接影响系统能否稳定承载真实流量。从HashMap的底层扩容机制到ConcurrentHashMap的锁粒度优化,从线程池参数配置到ThreadLocal的内存泄漏防范,这些核心技术点不仅是笔试中的高频考点,更是工程实践中保障交易链路可靠性的关键。围绕有赞2019校招Java笔试A卷,文章梳理了面向对象、异常处理、Spring Boot注解、接口安全签名、排序算法等模块,并结合典型踩坑场景给出可复用

339

一文搞懂java.util.ConcurrentModificationException异常原因和解决方法

文章目录场景复现原因分析解决方法ListMap 场景复现 对于list,map都有可能出现,这里主要分析list! @Test public void testList() { List<String> list = new ArrayList(); list.add("1"); list.add("2"); list.add("3"); list.add("4"); list.add

Apple_Boy的博客 1万+

如何在RT-DETR-R18中修改ultralytics的yaml文件(附完整代码)

本文详细指导如何在RT-DETR模型中,通过修改Ultralytics框架的yaml配置文件,将Backbone从ResNet50轻量化替换为ResNet18。核心步骤包括自定义ResNet18基础模块、调整HybridEncoder的expansion参数至0.5,并协同修改检测头Decoder层数,最终提供完整的配置文件代码,助力开发者在资源受限环境下部署轻量级实时目标检测模型。

weixin_29091445的博客 288

obisidian插件之【templater】模板的中文说明书

Templater 是一种模板语言,可让您将变量和函数结果插入到笔记中。它还允许您执行操作这些变量和函数的 JavaScript 代码。使用 Templater,您将能够创建强大的模板来自动执行手动任务。

m0_55795604的博客 1万+

Java ConcurrentModificationException 原理与4大场景解决方案

ConcurrentModificationException 是 Java 集合框架中典型的 fail-fast 机制体现,源于 modCount 修改计数器与迭代器 expectedModCount 快照的校验冲突。其本质并非并发专属,单线程遍历中调用 remove() 等结构性修改操作即会触发;核心原理是保障遍历过程的数据结构一致性,避免脏读或索引越界。该异常广泛影响 ArrayList、HashMap 等主流集合,在电商订单履约、配置中心、流式处理等高发场景中尤为关键。掌握 iterator 安全删

weixin_33736649的博客 336

Windows10下部署Heygem进行数字人生成

对于使用Heygem生成数字人,需要注意几个问题: + 需要使用Nvidia的显卡。 + 需要在Windows上进行本地部署。主要原因为客户端是Windows的,客户端对上传的视频写入硬编码的`D:\heygem_data\voice\data`目录,需要在容器上读取这些文件。 + 需要在Windows上部署Docker,将Windows的目录映射到容器中,由容器中的服务进行读取。 + 需要特别注意,一定要有D盘,这个D盘是Windows的D盘,不能是插入的USB设备后产生的D盘。 + 需要下载3个Doc

冀辉的博客 5619

【Java I/O】从一行 read() 追到底层:Java IO 到底做了什么

从一行 read() 出发,层层深入:FileInputStream 直接调用 native 方法,触发系统调用;每次读取都需穿越用户态与内核态,代价高昂。通过 BufferedInputStream 缓冲批量读取,减少系统调用次数,提升性能。而字符流如 InputStreamReader 则负责字节到字符的编码转换(如 UTF-8)。整个过程串联起 Java IO 的核心机制:装饰器模式、缓冲优化、字符编码与底层页缓存。最终揭示:高效 IO 本质是减少“过路费”,合理利用缓存与批处理。

qq_33202516的博客 603

手把手教你配置MCAL中的CAN模块:从基础参数到实战避坑指南

本文提供了一份详尽的MCAL CAN模块配置指南,涵盖从基础参数设置到实战避坑的全过程。文章深入解析了CAN控制器核心参数、硬件对象配置、数据流处理及常见问题排查,并结合源码分析,帮助嵌入式开发者构建稳定高效的CAN通信链路,是汽车电子领域通信开发的实用参考。

weixin_29165465的博客 336

2025年下半年网络规划设计师综合知识真题及答案解析

1983年,ARPANet完成技术转型,对此后的 Internet发展全关重要,这一转型是指( ) A.电路交换转向分组交换 B.商业化转型 C.民用化转型 D.从 NCP 协议转向 TCP/IP 答案:D 解析:ARPANet 最初使用 NCP (Network Control Protocol)协议进行主机问通信。1983年1月1日,ARPANet 正式切换到TCP/IP 协议族,为后续Internet的发展奠定了统一协议基础。

鹿鸣天涯 927

Java List源码与面试实战:从ArrayList底层到排序与线程安全

在Java集合框架中,List是最基础也最常被问到的数据结构之一。无论是ArrayList的连续内存数组,还是LinkedList的离散节点链表,其底层设计都直接决定了插入、删除、查询的复杂度表现。ArrayList的懒加载与1.5倍扩容机制、modCount与fail-fast快速失败原理,以及数组越界异常的真实触发条件,都是源码级的高频考点。同时,Arrays.asList与subList的隐藏陷阱、线程安全选型(如CopyOnWriteArrayList)以及如何将List按某元素排序(借助Compa

weixin_34226706的博客 443

2026华为OD面试手撕代码真题目录

一般面试的时候每一轮技术面都会出一到两个手撕代码题,这些题的特点就是,非常短小,易于理解。不可能会再出阅读理解一样的机试题的。但是这些题目也非常注意基本功,很注意细节的处理,一般都是easy+medium题目。但是大家一定要注意,因为大部分面试官上面一开始就会让你做题,直接看你所有的做题过程(防止有人水平一般,机试就网上找的答案的蒙混过关),手撕代码题会给你后面的面试定一个基调。

MISAYAONE的博客 9万+

Java List深度解析:ArrayList与LinkedList源码、扩容机制及面试避坑指南

在Java集合框架中,List是最核心的有序、可重复且支持下标访问的接口之一。理解其实现类ArrayList、LinkedList与Vector的底层数据结构,是掌握集合性能优化与安全用法的关键。ArrayList基于动态数组实现,随机访问O(1),扩容时按1.5倍增长,而LinkedList采用双向链表,头尾操作高效,但随机访问成本较高。快速失败机制和modCount字段决定了遍历时删除元素的安全方式。面对并发场景,CopyOnWriteArrayList提供读多写少的无锁方案,而Collections.

weixin_33858336的博客 343

uniapp - 解决App端报错reportJSException >>>> exception function:createInstanceContext, exception:white sc

uni-app,安卓Android,苹果ios,安卓app端,苹果App端,uniapp苹果安卓app,uniApp报错,reportJSException>>>>exceptionfunction:createInstanceContext,exception:whitescreencausecreateinstanceContextfailed,运行自定义基座时白屏,uniapp项目运行白屏reportJSException,检查没问题依旧报错,第三方库插件,组件,uniapp打包调试

🏆 前端领域优质创作者 1万+

单反相机物镜设计[DG-10]

REAR(要打在像面,操作数要找像面对应位置15):以透镜单位表示的真实光线径向坐标,波长由Wave定义,参见“Hx、Hy、Px和Py”。最小玻璃厚度最小不能小于semi-dia的1/10,要根据layout看有没有过厚过薄,反复调节。PROD:两个操作数的乘积(操作#1 X操作#2)。3x4就是57.3x0.41=23.5。拦光一般在第一面和最后一面操作,减少边缘无用光线。光阑面与镜面贴近,要调距离,同时设置光阑像差。后截距是指从镜头后表面到焦点的距离。CONS:弧度转为角度。镜头相互嵌入,有错误。

weixin_72050316的博客 600

贝壳找房Java春招笔试卷深度解析:核心考点与工程实践

在Java工程师的求职备战中,集合框架的底层原理、JVM内存模型与并发编程始终是笔试与面试的高频分水岭。理解HashMap的树化阈值、volatile的可见性语义以及线程池的拒绝策略,不仅是为了应对选择题,更是生产环境排查性能隐患的基础能力。MySQL索引失效场景与Redis缓存原子操作,则直接关系到高并发系统的稳定性设计。从LRU缓存的手写实现到秒杀场景的防超卖方案,技术选型背后都体现着对内存模型、锁机制与分布式一致性的深刻理解。本文以贝壳找房2023年春招Java笔试卷2为参考,拆解典型题目背后的原理关

weixin_33881140的博客 385

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

爱奇艺Java笔试真题复盘:从集合到并发,详解高频考点与手写代码思路

在Java后端开发中,集合框架、JVM与并发编程是衡量工程师基础能力的重要标尺。无论是HashMap的扩容机制、ArrayList的遍历删除陷阱,还是volatile与synchronized的可见性与原子性差异,这些核心知识点都是面试笔试中的高频考题。理解这些技术原理,不仅有助于应对大厂校招,也能在实际工程中写出更健壮的代码。从字符串常量池到线程池参数配置,从快速排序到边界条件处理,系统的知识梳理能帮助开发者构建完整的Java技术体系。本文围绕一套经典的大厂Java笔试题目进行复盘,覆盖基础语法、面向对象

weixin_34080951的博客 402

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

欢聚时代Java基础C卷解析:从核心考点到面试追问的完整攻略

Java基础笔试是校招后端岗位的第一道门槛,考察的并非复杂算法,而是对核心语言特性的精确理解。String常量池、HashMap底层原理、重载与重写等知识点,看似零散,实则串联起面向对象设计、集合框架与JVM内存管理的完整体系。深入理解String的不可变性、HashMap的put流程与扩容机制、多线程同步与volatile的可见性,能够帮助开发者在工程实践中写出更健壮、高效的代码。这些概念在在线笔试和面试场景中,常以程序输出题和追问链的形式出现,从“==”与equals的区别,到ConcurrentHas

weixin_34228387的博客 357

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

2024百度Java秋招笔试复盘:高频考点与避坑指南

在Java技术面试与笔试中,集合容器、JVM内存模型与并发编程始终是绕不开的核心考点。以HashMap为例,其底层数据结构、负载因子设计、线程安全边界,以及Comparator.comparing链式排序的灵活运用,都要求开发者不仅掌握语法,更要理解设计原理。同时,OutOfMemoryError这类运行时异常的排查思路,往往涉及堆内存分析、GC机制与常见JVM参数调优,是衡量工程实践能力的重要标尺。这些知识点不仅出现在日常开发中,更是百度等大厂Java秋招笔试的高频命题方向。从基础语法到集合框架,从JVM

weixin_34161064的博客 425

奇安信秋招Java笔试题3解析:从HashMap到线程池的考点全拆解

Java后端校招笔试中,集合、并发、JVM与Spring几乎是必考模块。以HashMap为例,JDK 8中链表转红黑树需同时满足长度达8且数组长度达64,背后是泊松分布与哈希碰撞防护的设计权衡。线程池的七个参数与执行流程则直接体现对高并发场景的理解,核心线程数、队列类型与拒绝策略的搭配需结合CPU密集或IO密集型任务实际调优。这些基础原理不仅决定笔试得分,更影响线上系统的稳定性与性能调优能力。从集合底层到JVM内存区域,从GC算法到类的双亲委派模型,再到Spring的IoC与Bean生命周期,知识点之间环环

weixin_34228387的博客 368

Java校招笔试客观题核心考点拆解:集合、JVM与并发

Java作为企业级开发的主流语言,其基础能力考察在校招笔试中占据重要地位。理解面向对象、集合框架、JVM内存模型与并发机制等核心概念,是掌握Java技术体系的关键。这些原理决定了程序性能与稳定性,广泛应用于高并发系统、中间件开发等场景。本文以一份典型校招客观题为引,系统梳理HashMap、类加载、线程安全等高频考点,帮助读者构建知识体系,提升笔试实战能力。

weixin_33875564的博客 408

Java校招基础卷复盘:面向对象、集合框架、异常JVM与手写排序

理解Java基础的核心在于掌握面向对象编程java的基本原理,比如继承、多态、重写与重载,以及java容器底层的数据结构与扩容机制。这些原理不仅是java面试题中反复考察的基础知识点,也直接关系到集合选型、遍历删除等工程实践的可靠性。进一步地,异常体系与JVM内存分配解释了java中数组越界异常和java: outofmemoryerror等错误背后的成因,帮助开发者快速定位问题。实际编码中,从冒泡排序java实现到快速排序java实现,都体现着边界处理与代码规范的基本功。这套校招Java基础类B卷,正是从

weixin_34416649的博客 453

科陆集团Java工程师笔试真题解析:基础语法到算法实战

Java后端面试常从语言基础、集合原理、JVM运行机制与算法基本功等通用概念入手。理解面向对象设计、接口与抽象类的边界,掌握HashMap的哈希寻址与扩容机制,是构建扎实技术底座的关键;而OOM异常的类型与排查思路,则直接体现解决线上问题的素养。在实际工程中,枚举类型用于状态建模、lambda函数简化集合操作,能有效提升代码可读性与安全性;冒泡排序与快速排序的手写实现,则考验对边界条件的细致把握。对于初学者,java环境变量配置、vscode运行java报错乱码、源发行版提示等问题常成为入门障碍,规范工具链

weixin_33755557的博客 399

2017年Java笔试题回顾:基础考点与面试实战思路

面向对象编程Java、集合框架、异常处理等核心概念,既是技术面试的高频考点,也深刻影响着日常代码的设计与质量。与其死记硬背零散的“Java八股文”,不如回归原理理解:HashMap为何用数组加链表且链表长度达8时转为红黑树?String为何设计为不可变?这些原理性知识正是各类“Java基础面试题”背后真正想考察的能力。掌握这些底座,在实际项目中才能合理选型集合、规范异常处理、避免内存隐患。本文围绕一份2017年经典Java笔试题,梳理出题逻辑、核心知识点与答题技巧,帮助读者构建体系化认知,从容应对校招或跳槽

weixin_34122810的博客 393

InnoDB 内存结构总览:Change Buffer、AHI 与 Log Buffer

本文系统梳理InnoDB内存结构中的ChangeBuffer、Adaptive Hash Index(AHI)与LogBuffer。ChangeBuffer缓存二级索引页不在内存时的变更,减少随机IO,仅在页加载时合并;聚簇索引修改立即执行,因数据本身不可延后。AHI基于高频等值查询自动构建哈希索引,加速定位,仅支持等值操作。LogBuffer为redo log内存缓冲,配合磁盘日志实现崩溃恢复。三者均服务于性能优化,其中ChangeBuffer与AHI共享BufferPool空间,而LogBuffer独立

bksczm的博客 285
上一篇: HashSet、TreeSet、LinkedHashSet:底层都是“套壳“
下一篇: 只改一个方向的引用,循环引用就能立刻被回收?一文讲透 weakref 弱引用
Zane199412
博客等级 码龄9年 71粉丝 99原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值