【问题标题】:Out of heap space error though my code is not complex尽管我的代码并不复杂,但堆空间不足错误
【发布时间】:2015-02-02 17:24:31
【问题描述】:

我已经编写了这个泛型类作为 Arraylist 的扩展(我知道我不应该这样做,但我必须这样做)。这个想法是添加通用对象并对它们进行排序。它编译得很好,当我测试它并添加一个对象(来自另一个类)时它工作得很好。但是,当我添加第二个对象时,程序会等待大约 30 秒,然后返回“java.lang.outofmemory error out of heap space”。

import java.util.ArrayList;
import java.util.*;

/**
 * extending to ArrayList
 */
public class SortedArrayList<E extends Comparable> extends ArrayList<E> 
{

/**
 * Constructing the super
 */
public SortedArrayList()    
{
   super();

  }

  public  void insertAndSort (E element){
  if (isEmpty()){
      add(element);
    }

  for ( int i = 0; i < size(); i++){
      E otherElement = get(i);
      if(element.compareTo(otherElement) > 0){
          add(i, element);
        }
      if(element.compareTo(otherElement) < 0) {
          add(i+1, element);
        }
    } 

}

}

谁能明白为什么会这样?我的 for 循环有问题吗? 谢谢

【问题讨论】:

  • 嗯,每次您调用insertAndSort 时,您都有可能加倍列表的大小。我怀疑你不是故意的。你调试过吗?

标签: java heap-memory comparator extend


【解决方案1】:

for ( int i = 0; i &lt; size(); i++) 中,当您添加一个元素时,大小也会增加 - 所以相同的元素会不断地添加。 假设,如果您先添加 1,然后尝试添加 2,那么它将继续添加 2,并且列表将变为 .........2,2,2,2,2,2,2..... ..........,1 并导致错误。

在循环使用之前获取变量的大小。

 int length= size();
for ( int i = 0; i < length; i++){
  E otherElement = get(i);
  if(element.compareTo(otherElement) > 0){
      add(i, element);
    }
  if(element.compareTo(otherElement) < 0) {
      add(i+1, element);
    }
} `

【讨论】:

    【解决方案2】:

    在您的循环中,您使用i &lt; size() 作为条件。每次添加新项目时,大小也会增加。

    顺便说一句,PriorityQueue 总是被排序的。但是如果你一定要使用数组列表,你需要记住循环之前的大小。

    【讨论】:

      【解决方案3】:

      您的insert 方法已关闭。您需要找到正确的位置并添加元素,而不是为当前List中的每个元素添加元素。

      public void insertAndSort(E element) {
          if (isEmpty()) {
              add(element);
              return;
          }
          int len = size();
          int pos = 0;
          while (pos < len && element.compareTo(get(pos)) > 0) {
              pos++;
          }
          add(pos, element);
      }
      

      并且泛型应该应用于Comparable。所以这个

      SortedArrayList<E extends Comparable>
      

      应该是

      SortedArrayList<E extends Comparable<E>>
      

      【讨论】:

        【解决方案4】:

        你的循环会一直持续到 i 达到它的大小。这永远不会发生,因为您不断向其添加元素,从而使大小相应地增长。

        【讨论】:

          猜你喜欢
          • 2022-11-11
          • 1970-01-01
          • 2017-03-10
          • 2015-05-18
          • 2014-01-04
          • 2017-11-14
          • 1970-01-01
          • 2023-03-17
          • 1970-01-01
          相关资源
          最近更新 更多