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

Java向ArrayList添加元素时报Java heap space堆内存溢出问题

问题产生原因

该错误的核心诱因是代码存在死循环逻辑漏洞:

  • 当三个指针i/j/k指向的元素相等时,代码仅执行了向ArrayList添加元素的操作,没有对三个指针做任何递增处理,导致每次循环都会重复判定这三个元素相等,无限向列表中插入相同元素,最终耗尽Java堆内存触发OOM。
  • 补充说明:如果你的三个输入数组没有提前做升序排序,三指针的比较逻辑本身就不成立,也会出现指针无法推进的死循环问题。

修复方案

基础修复(解决死循环问题)

在找到公共元素后同步递增三个指针,避免重复匹配同一个元素:

ArrayList<Integer> commonElements(int A[], int B[], int C[], int n1, int n2, int n3) 
{
    ArrayList<Integer> ls=new ArrayList<Integer>(n1);
    int i=0,j=0,k=0;
    while(i<n1 && j<n2 && k<n3){
        if(A[i]==B[j] && B[j]==C[k]){
            int t=A[i];
            ls.add(t);
            // 新增三行指针递增逻辑
            i++;
            j++;
            k++;
        }else if(A[i]<B[j]){
            i++;
        }else if(B[j]<C[k]){
            j++;
        }else{
            k++;
        }
    }
    return ls;
}

优化方案(公共元素自动去重)

如果要求返回的公共元素无重复(比如同一个值在数组中连续出现多次的场景),可以在指针递增时跳过所有和当前公共值相等的元素:

if(A[i]==B[j] && B[j]==C[k]){
    int t=A[i];
    ls.add(t);
    // 跳过A中所有等于t的重复元素
    while(i<n1 && A[i]==t) i++;
    // 跳过B中所有等于t的重复元素
    while(j<n2 && B[j]==t) j++;
    // 跳过C中所有等于t的重复元素
    while(k<n3 && C[k]==t) k++;
}

注意:该三指针方案的前提是三个输入数组均为升序排序状态,如果输入数组未排序,需要先对三个数组分别排序后再执行上述逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 14:06:03