为什么迭代列表给我stackoverflow错误?

时间:2017-03-09 20:15:42

标签: java algorithm list

每当运行代码时,我都会收到Stackoverflow。我无法理解为什么会这样?我们如何解决它?

  public boolean compare(List<Task> source, List<Task> actual) {
    return compareTasks(source, actual) && compare(actual, source);
  }

  public boolean compareTasks(List<Task> source, List<Task> actual) {
    matchList = new ArrayList<Task>();
    differList = new ArrayList<Task>();
    for (Task task : actual) {
      if (source.contains(task)) {
        matchList.add(task);
      } else {
        differList.add(task);
      }
    }
    return (differList.size() == 0) ? true : false;
  }

以下是错误:

java.lang.StackOverflowError
    at java.lang.StringBuilder.append(StringBuilder.java:119)
    at com.user.test.Task.getKey(Task.java:209)
    at com.user.test.Task.equals(Task.java:220)
    at java.util.ArrayList.indexOf(ArrayList.java:216)
    at java.util.ArrayList.contains(ArrayList.java:199)
    at java.util.Collections$UnmodifiableCollection.contains(Collections.java:1000)

2 个答案:

答案 0 :(得分:10)

我相信问题就在这里:

public boolean compare(List<Task> source, List<Task> actual) {
   return compareTasks(source, actual) && compare(actual, source);
}

想象一下,您想要将列表A与列表B进行比较。如果您注意到:

  • 调用比较(A,B)调用compare(B,A)。
  • 调用比较(B,A)调用compare(A,B)。
  • 调用比较(A,B)调用compare(B,A)。
  • 调用比较(B,A)调用compare(A,B)。
  • 调用比较(A,B)调用compare(B,A)。
  • 调用比较(B,A)调用compare(A,B)。
  • 调用比较(A,B)调用compare(B,A)。
  • 调用比较(B,A)调用compare(A,B)。

此递归永远不会终止,因此最终会触发堆栈溢出。

要解决此问题,请考虑将其重写为

public boolean compare(List<Task> source, List<Task> actual) {
   return compareTasks(source, actual) && compareTasks(actual, source); // call compareTasks, not compare.
}

答案 1 :(得分:4)

您在方法中再次调用compareTasks。将其更改为以下行: return compareTasksList(source, actual) && compareTasksList(actual, source);