Java中List对象中clear()方法和List=null方法来清空List的异同(由一道算法题发现)

Mockito doThrow()方法详解:Java单元测试中模拟异常抛出的核心技巧 在Java单元测试中,异常处理是验证代码健壮性的关键环节。Mockito作为主流的测试框架,其`doThrow()`方法专门用于模拟方法调用时抛出异常的场景,尤其适用于void方法或Spy对象的异常模拟。理解异常模拟的原理,能帮助开发者构建更全面的测试用例,覆盖正常流程外的边界情况。从技术价值看,模拟异常可以验证系统的容错机制、重试逻辑和资源清理等关键行为,提升代码的可靠性。在实际应用场景中,无论是测试支付失败、网络超时还是文件操作异常,`doThrow()`都能精确构造异常环境。本文聚焦`doThrow( 阅读详情

今天在刷力扣的时候因为一道比较简单的题卡住了,题目如下

比较常规的写出了一开始的代码。

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
class Solution {
    public List<List<Integer>> levelOrder(TreeNode root) {
        Queue<TreeNode> q=new LinkedList<>();
        List<Integer> curLevel=new LinkedList<>();
        List<List<Integer>> res=new LinkedList<>();
        q.offer(root);
        int n=1;
        int nums=1;
        while(q.peek()!=null){
            TreeNode curNode=q.poll();
            nums--;
            curLevel.add(curNode.val);
            if(curNode.left!=null){q.offer(curNode.left);nums++;}
            if(curNode.right!=null){q.offer(curNode.right);nums++;}
            if(--n==0){
                res.add(curLevel);
                n=nums;
                curLevel.clear();
            }
        }
        return res;
    }
}

但是运行的时候发现,结果是这样的

经过调试,发现问题在curLevel.clear()上,当修改后

改为

curLevel=new LinkedList<Integer>()

发现就对了。

因为之前刷题的话C++写的比较多,所以习惯性的用clear()方法,今天就遇到了问题,然后开始发现了问题。

很显然的是,clear()方法一定不是简单的把这个List的内容或首地址清空,一定程度上涉及了指针操作,猜想是由于clear把里面的元素的引用给释放了。

带着猜想去读了下源码。

首先是ArrayList的clear源码

/** 
     * Removes all of the elements from this list.  The list will 
     * be empty after this call returns. 
     */  
 
public void clear() {  
 
        modCount++;  
 
// Let gc do its work  
 
for (int i = 0; i < size; i++)  
 
            elementData[i] = null;  
 
        size = 0;  
 
}  

然后是LinkedList的clear源码

public void clear() {  
 
// Clearing all of the links between nodes is "unnecessary", but:  
 
// - helps a generational GC if the discarded nodes inhabit  
 
//   more than one generation  
 
// - is sure to free memory even if there is a reachable Iterator  
 
for (Node<E> x = first; x != null; ) {  
 
           Node<E> next = x.next;  
 
           x.item = null;  
 
           x.next = null;  
 
           x.prev = null;  
 
           x = next;  
 
       }  
 
       first = last = null;  
 
       size = 0;  
 
       modCount++;  
 
   }  

看代码不难发现,clear()方法把List内每个元素的引用全部置为null,由于Java的自动GC机制,其引用对应的内存因为没有引用都被回收,所以我最后返回res的时候,因为引用的内容被清空了,所以我访问到的三个List都是空的List。

错误的原因找到了,然后查看利用重新初始化的方法。

原因也比较显然,重新初始化的时候重新创建了空间,引用被赋值了,而原先List内部的元素引用都仍然在,仍可以通过原先的引用访问到元素的内容。

所以,还是要多读源码....

C#操作Excel六种主流方案深度解析:从COM到EPPlus/NPOI实战选型指南 在.NET开发中,数据交换与报表生成是核心需求,而Excel文件处理则是实现这一需求的关键技术环节。其原理在于通过程序化方式读写Excel文件的结构化数据,这涉及到对文件格式(如.xls的二进制格式与.xlsx的Open XML格式)的解析与构建。掌握高效的Excel操作技术,能极大提升数据处理自动化水平与系统集成能力,其价值体现在简化工作流、保证数据一致性和支持复杂业务报表生成。应用场景广泛覆盖从服务器端批量数据导出、Web应用中的文件上传解析,到桌面客户端的报表设计。针对C#开发者,面对COM互操作、O 阅读详情

相关推荐

新建菜单Office被替换为腾讯文档 - 解决方案

右键新建菜单中的Office被替换为腾讯文档。原因是安装了腾讯文档软件,此软件安装时会自动将新建菜单中的Office替换为腾讯文档,下文介绍解决方案。

NSJim的博客 2928

List集合的clear方法

List集合的clear方法 一 . list.clear()底层源码实现 在使用list 结合的时候习惯了 list=null ;在创建这样的方式,但是发现使用list的clear 方法很不错,尤其是有大量循环的时候 1、list 接口...

2832

光模块基础知识【快速入门】02

光模块是用于交换机与设备之间传输的载体,是光纤通信系统中的核心器件。主要作用是发射端将设备的电信号转换成光信号。 光纤通道光模块和以太网光模块 光纤通道光模块 光纤通道(FC, Fiber Channel)是一种高速网络数据传输协议。光纤通道协议可以有序无损地传输原始数据,它主要用于在数据中心、电脑服务器、交换机与存储网络中进行数据传输。 FC光模块遵循FC协议,充当着光纤通道系统之间的接口,也是光纤存储网络设备间的接口。它们主要用于数据中心的光纤通道存储网络链接中。 FC光模块具有小型化和低.

Jin Hanquan的博客 3万+

java开发_""和null的区别

今天在工作中遇到一个问题: 在代码中: 1 //name可以为"",即:name == "" 2 //但是name不可以为null,即:name != null 下面是java中的null和""区别: 1 null和""的区别 2 问题一: 3 null和""的区别 4 String s=null; 5 string.trim()就会...

abxlep7702的博客 409

使用Zed 实现测距

此代码基于官方代码基础上进行改写,主要是获取zed相机深度画面的深度值,为yolo测距打基础。Zed相机是由Stereolabs公司开发的一种先进的立体视觉相机。这种相机专为计算机视觉和机器学习应用而设计,能够提供高质量的3D捕捉和分析功能。: Zed相机配备有一对垂直排列的传感器,能够捕捉两个略有偏移的图像,从而模拟人的双眼视觉,实现深度感知。: 利用立体成像技术,Zed相机能够实时生成环境的3D模型,这对于机器人导航、增强现实(AR)和虚拟现实(VR)等应用至关重要。

weixin_45303602的博客 912

单片机原理及应用知识点汇总(一)

在键闭合稳定时,读取键的状态,并且必须判别;、串行通信的优点是只需一对传送线,成本低,适于远距离通信,缺点是传送速度较低。、并行通信的优点是传送速度高,缺点是所需传送线较多,远距离通信不方便。、串行通信中,为使设备同步工作,需要通信双方有两个共同的要求,一是。系列单片机的指令中,既有带借位的减法指令,又有不带借位的减法指令。、简述在使用普通按键的时候,为什么要进行去抖动处理,如何处理。、在异步通信的帧格式中,数据位是低位在前高位在后的排列方式。、异步通信中,波特率是指每秒传送二进制代码的位数,单位是。

T19900的博客 696

list清空_把list清空和赋值null对内存释放的区别

一般看法:list=null;能更快的释放内存, list.Clear();只是清空了内容 在内存上它还是占有空间,而=null 就是不占用内存空间大佬看法:=null还没有立刻把内存清掉,要调用GC.Collect();才会清掉内存, Clear方法和=null差不多,也不会马上把内存清掉,直到GC.Collect()调用为止(如果你不调用的话系统会在适当的时机调用)。不过调用list.Clea...

weixin_39663602的博客 1710

使用Python,OpenCV查找图像中的最亮点

这篇博客展示了,为什么在图像中找到最亮的点之前应用高斯模糊是至关重要的。 通过应用高斯模糊,可以将每个给定半径内的像素平均在一起。取平均值可以去除高频噪声,否则会影响cv2.minMaxLoc函数的结果。 一定要研究高斯模糊半径的恰当值。如果取值太小,将会减轻平均值的影响,而忽略了更大、更亮的区域。但是如果半径太大,将无法探测到小的明亮区域。

qq_40985985的博客 3809

C# | List.Clear() 和 List = null 产生不同的运行结果

在使用 C# 的 List 时,发现 Clear 和赋为 null 产生了不一样的结果,根据所查资料对这个现象进行了分析。

b02921的博客 2738

【AN7581】AN7581 SDK编译环境搭建操作说明

安装编译需要的工具包。

wgl307293845的博客 338

Multisim14.0仿真(五十九)基于74LS161的24进制计数器应用设计

它具有同步预置、异步清零功能,支持并行数据加载,并可在计数使能控制下进行二进制计数。:低电平时,在下一个时钟上升沿加载输入数据(A, B, C, D)。(多个 74LS161D 串联构成 8 位、12 位等更长计数器)。低电平时,下一个时钟上升沿加载输入数据(A, B, C, D)。:低电平有效,立即清零计数器(不受时钟控制)。均为高电平时,每个时钟上升沿计数。:两者均为高电平时,计数器才能递增。:立即清零计数器(不受时钟控制)。(通过预置初始值控制计数范围)。(计数范围:0 ~ 15,即。

corlin6688的博客 4759

java中ArrayList之clear内存回收

右边为调用clear后内存情况 现将list.clear改为 list=null,再看看运行情况 赋值NULL后不仅列表中的对象变成了垃圾,为列表分配的空间也会回收 clear()只是清除了对象的引用,使那些对象成为垃圾

china199225的博客 1万+

ASPICE(Automotive SPICE)流程落地,研发管理工具自研,如何从量化数据体现研发效率提升的

摘要: ASPICE流程显著提升研发效率,主要体现在质量、成本和时间三个维度。关键量化指标包括:缺陷率降低30%-60%,维护工作量减少28%,研发周期缩短10%-20%,需求变更率降低58%,代码评审效率提升300%。初期开发成本虽增加9%,但长期回报率高。核心方法包括缺陷预防前移、需求精准管理和流程标准化与自动化。建立量化度量体系需覆盖缺陷密度、需求稳定性、进度偏差等指标,并依托工具链支持数据收集。实施ASPICE是短期投入换取长期质量提升和成本优化的高效投资。

汽车软件开发 182

java返回空list对象_Java中List对象中clear()方法和List=null方法来清空List的异同(由一道算法题发现)...

今天在刷力扣的时候因为一道比较简单的题卡住了,题目如下 比较常规的写出了一开始的代码。/*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeNode left;* TreeNode right;* TreeNode(int x) { val = x; }* }*...

weixin_31495637的博客 636

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

Java List 完整知识体系(Java 版,面试全覆盖)

本文全面剖析Java List集合体系,从底层源码、设计思想到生产实践,涵盖核心实现类对比、线程安全机制、遍历方式优化及工具方法应用。主要内容包括: 架构体系:List继承Collection接口,核心实现类ArrayList(动态数组)、LinkedList(双向链表)、Vector(废弃线程安全类),各自针对不同场景优化。 核心实现对比: ArrayList:随机访问O(1),尾部操作高效,但中间增删需数组移位;JDK8懒加载+1.5倍扩容优化内存 LinkedList:首尾增删O(1),无扩容开销,但

专注 Java 后端开发,分享基础语法、JVM、并发、Spring 全家桶、微服务、分布式、性能优化等实战干货。坚持输出高质量技术笔记,用简单语言讲清复杂原理,助力每一位 Java 开发者稳步进阶。 356

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

集合框架二(HasMap接口,iterator,泛型集合)

Map接口常用方法: Map c = new HashMap();//声明 c.put(Object key,Object val)//以"键-值"方式存储 c.get(Object key);//通过key获得val c.size();//返回元素个数 c.containsKey(Object key);//判断键是否存在 c.containsValue(Object val);//判断值是否...

匿名攻城狮 758

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

Java基础面试题总结《三》

SPI全称是(服务提供者接口)。它是一种基于接口的动态扩展机制。简单来说,就是 Java 定义了一套标准接口,但具体的实现交给第三方(开发者或厂商)去完成。系统运行时,会自动发现并加载这些实现类,而不需要硬编码在代码里。目的:确保逻辑相等的对象拥有相同的哈希码,从而能被正确地存入和取出哈希集合。原则只要参与了哈希运算(作为 Key 或集合元素),就必须同时重写这两个方法。策略模式和观察者模式都属于行为型设计模式。

qq_55862497的博客 259

HashSet与SortedSet选型指南:哈希表vs红黑树的性能分野

HashSet和SortedSet是.NET中实现去重的核心集合类型,分别基于哈希表和红黑树两种经典数据结构。哈希表通过哈希函数+桶数组实现接近O(1)的查找与插入,适合高频存在性判断;红黑树则通过自平衡二叉搜索树保障有序性,支持O(log n)范围查询、极值获取与稳定遍历。二者并非替代关系,而是针对‘速度优先’与‘秩序刚需’场景的分工设计。在电商订单去重、权限管理、风控日志分析等典型业务中,合理选用可将耗时从毫秒级压至微秒级,并显著降低内存开销。本文结合WizardWu技术笔记的底层洞见,解析构造预设、比

baochuanying9531的博客 457

关于=null和clear() 问题(Java性能篇)

关于=null和clear() 问题(Java性能优化)   以ArrayList为例,根据情况来看吧,ArrayList内部维护的是一个数组。 1. list = null 那么你list = null; 就是释放这个数组对象,当然里面所引用的对象也就释放了。 2. list.clear() 如果list.clear(); 看看源代码就知道了,是把list里面对象遍历赋值为null,意思就是

wonderomg 9078

List.clear和List==null

今天在看公司的源码时,有一段代码类似以下代码,根据条件匹配。 public void test() { List<Map<String, Object>> listMap1 = new ArrayList<>(); List<Map<String, Object>> listMap2 = new ArrayList<>(); for (Map map1: listMap1

搬砖刘疯狂 1141

java中的list集合的clear方法详解以及使用时遇到的问题

废话不多说,直接上代码------------------> String serialNo = "2118%000690;2118%000691;2118%000692;2118%000693;2118%000694;2118%000695;2118%000696;2118%000697;2118%000698;2118%000699;" + "2118%000700;2118%000701;2118%000702;2118%00

weixin_42965737的博客 9912

循环使用List集合时,使用clear()方法对List集合进行置空

首先,清空LIst的方法有三种: 1、list = null; 2、list = new ArrayList(); 3、list.clear(); 这三种方法,再循环结构中使用起来比较方便的就是clear()方法,该方法需要注意的一点是:其它引用该list的值也会变成空。 这里可以将list的值通过new ArrayList()赋给一个新的对象,这样在clear()时就不会清空引用该list值的对象。 List<List<Person...

A__cup__of__Java的博客 3717

java中list.clear()和list = null对于GC有没有帮助?

java中 list.clear() 和 list = null 对于GC有没有帮助

Disillusion021的博客 6134

关于 =null 和 clear() 问题(Java性能篇)

https://blog.youkuaiyun.com/u012406177/article/details/70244920 1 list = null list = null: 就是释放这个数组对象,当然里面所引用的对象也就释放了。 2 list.clear() list.clear(): 是把list里面对象遍历赋值为null,意思就是释放list里面所有对象,但是list对象没释放内存哦。 clear...

try to do 1102

java list clear 垃圾回收_list.clear()vs list = new ArrayList <Integer>(); [重复]

问题这个问题在这里已有答案:清空一个ArrayList或者只是创建一个新的ArrayList并将旧的那个垃圾收集? [重复] 4个答案Map.clear()vs new Map:哪一个更好? [重复] 7个答案清除ArrayList的两个选项中哪一个更好更快,为什么?list.clear()要么list = new ArrayList();碰巧我必须在随机的时间清除我的ArrayList中的所有条...

weixin_35531779的博客 1126
上一篇: MySQL中的sql语句执行过程
下一篇: 消息队列介绍
Tate_Brown
博客等级 码龄9年 39粉丝 107原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值