为什么我在Java中遇到堆空间错误?

来源:爱站网时间:2021-09-25编辑:网友分享
[我正在尝试编写一个名为scaleByK的方法,该方法将整数ArrayList作为参数,并用自身的k个副本替换值k的每个整数。例如,如果列表存储了...

问题描述


[我正在尝试编写一个名为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 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 list) {
        int j = 0;
        while( j 

思路一:


您一直将已处理元素的副本插入正在读取的同一列表的后面。因此,在处理完原始元素之后,您将开始处理它们的副本,然后再处理其副本的副本,等等。这永远不会停止,并且会导致堆溢出。创建一个新列表,该列表将保留结果并从该方法返回结果,请不要修改当前列表。

public List scalebyk(ArrayList list) {
  List result = new ArrayList();
  for (Integer element : list) {
    for (int i = 0; i 

思路二:


这是因为您的代码将永远不会终止。以下是您的scaleByk函数的流程:

  • 第一个元素为4,j=0,因此会将4个新元素添加到列表中,值为4

  • j=4,但仍小于list.size(),因为在上一步中将大小增加了4。同样,它将触发添加值为4的4个元素。

此循环将一直重复,直到用完分配给程序的堆空间为止。

上一篇:[在Android中更新CSV文件后更新Listview

下一篇:如何匹配字符串中所有不以英语字母开头的数字的所有组合,在Java中都是常规匹配

您可能感兴趣的文章

相关阅读

热门软件源码

最新软件源码下载