【问题标题】:Exception when removing elements from ArrayList?从 ArrayList 中删除元素时出现异常?
【发布时间】:2019-03-30 09:50:38
【问题描述】:

我正在用随机整数填充 ArrayList al。 然后,当我尝试删除它们时,我收到了这些错误:

线程“主”java.lang.IndexOutOfBoundsException 中的异常:索引 长度为 5000 的 5000 出界 java.base/jdk.internal.util.Preconditions.outOfBounds(Preconditions.java:64) 在 java.base/jdk.internal.util.Preconditions.outOfBoundsCheckIndex(Preconditions.java:70) 在 java.base/jdk.internal.util.Preconditions.checkIndex(Preconditions.java:248) 在 java.base/java.util.Objects.checkIndex(Objects.java:372) 在 java.base/java.util.ArrayList.remove(ArrayList.java:517) 在 a2_40038465.ListTester.main(ListTester.java:137)

这是我的代码:

System.out.println("-----------------------------------------------------------------------------");
    System.out.println("Inserting at the beginning...");
    long startTime4 = System.currentTimeMillis();

    for(int i=0; i<10000; i++) {
        al.add(0, rand.nextInt(20001));
    }

    long endTime4 = System.currentTimeMillis();
    long elapsed4 = endTime4 - startTime4;
    System.out.println("Time elapsed: " + elapsed4);
    System.out.println("-----------------------------------------------------------------------------");

    System.out.println("Removing from beginnig...");
    long startTime19 = System.currentTimeMillis();

    for(int i=0; i<10000; i++) {
        al.remove(i);
    }

    long endTime19 = System.currentTimeMillis();
    long elapsed19 = endTime19 - startTime19;
    System.out.println("Time elapsed: " + elapsed19);
    System.out.println("-----------------------------------------------------------------------------");

【问题讨论】:

  • 当我将其更改为 i&lt;5000 时,它可以工作。
  • ArrayList 从零开始,所以在大小为 5000 的 List 中,最后一个索引是 4999
  • 如果要从头删除,请使用remove(0),而不是remove(i)。也许尝试调试它以查看发生了什么,无论是使用调试器还是在纸上。
  • 删除前 5000 个元素后,只剩下 5000 个。所以你的索引现在超出了范围。
  • @Qwerty0987 “为什么限制为 5000?”因为您已经删除了前 5000 个元素。

标签: java list arraylist indexoutofboundsexception


【解决方案1】:
al.remove(i);

删除索引i 处的元素。在删除开始时,您的列表有 10000 个项目。在循环的前 5000 次迭代之后,您的列表只有 5000。然后您调用 al.remove(5000),它在大小为 5000 的数组中不再被允许。在列表中有 5001 个元素并调用 al.remove(4999) 之前的步骤中,这是允许的。

在循环中使用remove(0) 或在没有任何循环的情况下使用clear() 来删除所有元素。

您的主要错误可能是认为remove(0) 和随后的remove(1) 删除了数组的前两个元素。但事实并非如此。实际发生的是第一条语句删除了第一个元素,之后原来的第二个元素变成了第一个,第三个变成了第二个,等等。所以remove(1) 之后删除了原来的第三个元素。如果您继续该逻辑,您将永远不会删除最初的第二个元素(以及许多其他元素)。

【讨论】:

    猜你喜欢
    • 2014-06-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-29
    • 1970-01-01
    • 2013-02-24
    相关资源
    最近更新 更多