未调用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
相关产品推荐
相关产品推荐

