簡體   English   中英

為什么我在 Java 中遇到堆空間錯誤?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM