[英]why i'm getting heap space error in java?
我正在嘗試編寫一個名為 scaleByK 的方法,該方法將整數的 ArrayList 作為參數,並將值 k 的每個整數替換為自身的 k 個副本。 例如,如果列表在調用方法之前存儲值 [4, 1, 2, 0, 3],則它應該存儲值 [4, 4, 4, 4, 1, 2, 2, 3, 3, 3] 方法執行完畢后。 應通過此方法從列表中刪除零和負數。 問題是我收到了 java 堆空間的錯誤。
public class Lab1construct2 {
public static void main(String[] args) {
ArrayList<Integer> list = new ArrayList<>();
list.add(4);
list.add(1);
list.add(2);
list.add(0);
list.add(3);
Lab1construct2 myprogram = new Lab1construct2();
myprogram.scalebyk(list);
System.out.print(list);
}
public void scalebyk(ArrayList<Integer> list) {
int j = 0;
while( j < list.size()) {
int elm =list.get(j);
for(int i=1; i<=elm; i++) {
list.add(elm);
}
j = j + list.get(j);
}
}
}
您不斷將已處理元素的副本插入到您正在閱讀的同一列表的后面。 因此,在處理完原始元素后,您開始處理它們的副本,然后是它們副本的副本,等等。這永遠不會停止,並且您會得到堆溢出。 創建一個將保留結果並從方法返回的新列表,不要修改當前列表。
public List<Integer> scalebyk(ArrayList<Integer> list) {
List<Integer> result = new ArrayList<Integer>();
for (Integer element : list) {
for (int i = 0; i < element; i++) {
result.add(element);
}
}
return result;
}
這是因為您的代碼永遠不會終止。 以下將是您的 scaleByk 函數的流程:
第一個元素是 4, j=0
因此 4 個新元素將被添加到列表中,值為 4
j=4
但仍然小於list.size()
因為在上一步中大小增加了 4。 它將再次觸發添加 4 個值為 4 的元素。
這個循環會不斷重復,直到你用完分配給你的程序的堆空間。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.