【问题标题】:Why iterating list gives me stackoverflow error?为什么迭代列表会给我stackoverflow错误?
【发布时间】:2017-03-09 20:15:41
【问题描述】:

只要运行以下代码,我就会得到 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)

【问题讨论】:

  • 小建议:如果你发现自己在写blah ? true : false,就用blah。没有必要写“如果 blah 为真,则为真,如果为假,则为假”。所以在你的方法中,只需return differLists.size() == 0。 (类似地,不用blah ? false : true,只需使用!blah)。

标签: java algorithm list


【解决方案1】:

我相信问题出在这里:

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

假设您想将列表 A 与列表 B 进行比较。如果您注意到:

  • 调用 compare(A, B) 调用 compare(B, A)。
  • 调用 compare(B, A) 调用 compare(A, B)。
  • 调用 compare(A, B) 调用 compare(B, A)。
  • 调用 compare(B, A) 调用 compare(A, B)。
  • 调用 compare(A, B) 调用 compare(B, A)。
  • 调用 compare(B, A) 调用 compare(A, B)。
  • 调用 compare(A, B) 调用 compare(B, A)。
  • 调用 compare(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.
}

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2018-03-17
      • 1970-01-01
      • 2019-10-05
      • 2017-12-06
      • 2012-12-30
      • 1970-01-01
      • 1970-01-01
      • 2022-12-11
      • 2014-07-18
      相关资源
      最近更新 更多