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

未调用add()方法,tempSub为何被意外加入userSubs列表?

问题分析与解决:tempSub意外被加入userSubs的原因

这是Java引用类型的经典坑——你误以为toDisplay是独立于userSubs的新列表,但实际上两者指向的是同一个内存对象!

核心原因拆解

看你这段代码:

ArrayList<Submission> toDisplay = new ArrayList<>(); 
toDisplay = dm.theUser.getAllSubmissions(); // 关键问题在这里

第一行你确实创建了一个空的新ArrayList,但第二行的赋值操作直接把这个新列表的引用丢弃了,转而让toDisplay指向getAllSubmissions()返回的原列表(也就是userSubs本身)。这意味着**toDisplay和userSubs是同一个列表的两个别名**,后续调用toDisplay.add(dm.tempSub),本质上就是在修改userSubs。

首次运行时,userSubs还没被修改,所以显示正常;但当你返回重新加载页面时,之前的add操作已经悄悄修改了userSubs,导致tempSub出现在了原本不该出现的列表里。

修复方案

你需要创建原列表的独立副本,而不是直接赋值引用。把代码改成这样:

// 用原列表作为构造参数,创建一个全新的ArrayList副本
ArrayList<Submission> toDisplay = new ArrayList<>(dm.theUser.getAllSubmissions());
if(dm.tempSub.draftCreated) {
    toDisplay.add(dm.tempSub);
}
saa = new submissionArrayAdapter(userSubmissions.this, toDisplay.toArray(new Submission[toDisplay.size()]));

这样toDisplay就是完全独立的新列表,后续添加tempSub只会影响这个用于展示的列表,不会修改原userSubs。

额外验证小技巧

你可以在赋值前后打印两个列表的哈希值,验证是否是同一个对象:

System.out.println(dm.theUser.getAllSubmissions().hashCode());
System.out.println(toDisplay.hashCode());

原来的代码中两者哈希值相同,修复后会不同,直观证明它们是不同的对象。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 10:07:22