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

