Java中的循环异常

Ngu*_*Duy 2 java linked-list

我有这个代码来测试链表和数组列表之间的性能:

long start = System.currentTimeMillis();
for (int i = 0; i < 1E5; i++) {
    list.add(i);
}

for (int i = 0; i < 1E5; i++) {
    list.remove(i);
}

long end = System.currentTimeMillis();

System.out.println(type + ":" + (end - start));
Run Code Online (Sandbox Code Playgroud)

但后来我收到了这个错误:

线程"main"中的异常java.lang.IndexOutOfBoundsException:索引:50000,大小:50000.

我很困惑.所以我打开我的Visual Studio并试图用c#做同样的事情:

List<int> numbers = new List<int>();
for (int i = 0; i < 1E5; i++)
{
    numbers.Add(i);
}

for (int i = 0; i < 1E5; i++)
{
    numbers.Remove(i);
}

Console.WriteLine("It's done");
Run Code Online (Sandbox Code Playgroud)

它运行得很好.所以我在java代码上做错了什么,或者这里有一些特别的东西要学习!对不起,如果我写坏英语:(

Joo*_*gen 5

remove(int)删除指定索引处的项目,你要调用remove(Object)的.NET一样.

list.add(Integer.valueOf(i));
list.remove(Integer.valueOf(i));
Run Code Online (Sandbox Code Playgroud)

老答案

在删除时,大小会发生变化,最后在i = 0时只有一个元素,但是你要删除100000-1.

for (int i = 0; i < 1E5; i++) {
    list.remove(i);
}
Run Code Online (Sandbox Code Playgroud)

要么这样做

for (int i = 0; i < 1E5; i++) {
    list.remove(0);
}

for (int i = 0; i < 1E5; i++) {
    list.remove(list.size() - 1);
}

for (int i = 0; i < 100_000; i++) {
    list.remove(i % list.size());
}
Run Code Online (Sandbox Code Playgroud)

  • @dimwittedanimal只是一个猜测,但我认为在另一种语言中,`remove`有一个不同的语义,例如删除数字`50000`而不是索引`50000`的元素.(在Java中,使用`List <Integer>`,它有些含糊不清) (3认同)