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

两个ArrayList去重方法的差异:为何显式维护size才生效?

ArrayList去重方法的差异原因解析

我原本以为这两个ArrayList去重方法逻辑本质上是一致的,但实际测试后发现,只有显式定义并手动维护size变量的代码才能得到符合预期的去重结果。

不符合预期的代码

public static ArrayList<String> removeDuplicates(ArrayList<String> miembres)
{
    for(int i = 0; i < miembres.size() - 1; i++)
    for(int j = i + 1; j < miembres.size(); j++)
    if(miembres.get(i).equals(miembres.get(j)))
    {
     miembres.remove(j);
     j--;
    }
    return miembres;
}

符合预期的代码

public static ArrayList<String> removeDuplicates(ArrayList<String> miembres)
{
    int size = miembres.size();
    for(int i = 0; i < size - 1; i++)
    for(int j = i + 1; j < size; j++)
    if(miembres.get(i).equals(miembres.get(j)))
    {
     miembres.remove(j);
     size--;
     j--;
    }
    return miembres;
}

为什么for循环无法自动适配ArrayList的size变化?

核心原因是每次调用miembres.size()都会实时返回当前ArrayList的实际元素数量,而显式维护的size变量是基于初始集合大小、手动同步修改的,两者的循环终止条件逻辑完全不同:

  • 对于不符合预期的代码:
    内外层循环的终止条件每次判断时都会重新获取集合的实时大小。当删除元素后,集合实际大小减小,外层循环的i会提前触发终止条件,导致部分元素没被遍历检查;内层循环的终止边界也会不断收缩,容易出现漏判重复元素的情况,最终去重不彻底。

  • 对于符合预期的代码:
    一开始就把集合的初始大小赋值给size变量,只有在删除元素时才手动执行size--同步更新。内外层循环始终基于这个手动维护的size执行遍历,相当于以初始集合的元素数量为基准完成完整检查,不会因为中途删除元素导致提前终止循环,能确保所有元素都被正确检查重复情况。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 07:18:28