You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何将List引用置为null后,原列表的大小未发生变化?

为什么将方法内的引用置为null不影响原对象?

首先肯定你的理解:你前面的判断完全正确——调用someVoid()时传递的确实是list引用的副本,添加元素后列表大小变为2这部分逻辑没问题,不用怀疑~

接下来解释为什么list = null之后原列表大小还是2,核心在于Java的按值传递规则,尤其是引用类型的传递逻辑:

Java里所有参数传递都是按值传递的。对于引用类型来说,传递的“值”是对象引用的副本——也就是说,someVoid方法里的list参数,和Test类里的this.list是两个独立的引用变量,但它们一开始指向同一个ArrayList对象。

我们一步步拆解你的代码执行流程:

  • 构造方法中this.list = new ArrayList<>():此时test.list引用指向一个空的ArrayList对象。
  • 调用someVoid(list):把test.list的引用值复制了一份,传给方法的list参数。现在两个引用(test.list和方法内的list)都指向同一个ArrayList实例。
  • list.add(0)和list.add(1):通过方法内的引用副本操作对象,修改的是同一个ArrayList实例的内容,所以test.list指向的对象大小也变成了2——这就是你能理解的部分。
  • list = null:这一步只是把方法内的那个引用副本设置为null,让它不再指向任何对象,但test.list这个原引用完全不受影响,依然指向那个大小为2的ArrayList对象。

打个简单的类比:你有一把能开房间的钥匙(test.list),你复制了一把给朋友(方法内的list参数)。朋友用复制的钥匙进房间放了两件东西(add元素),你用原钥匙进去也能看到这两件东西。但如果朋友把复制的钥匙掰断了(list = null),你的原钥匙还是能正常打开房间,房间里的东西也不会消失。

你的测试代码格式化后如下:

public class Test {
    List<Integer> list;

    public Test() {
        this.list = new ArrayList<>();
        someVoid(list);
    }

    private void someVoid(List<Integer> list) {
        list.add(0);
        list.add(1);
        list = null;
    }

    public static void main(String[] args) {
        Test test = new Test();
        System.out.println("Size is: " + test.list.size());
    }
}

所以main方法中打印test.list.size()时,test.list依然指向那个被添加了两个元素的ArrayList,输出自然是2。

内容的提问来源于stack exchange,提问作者elvintaghizade14

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.11 08:24:26