我有这个代码来测试链表和数组列表之间的性能:
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代码上做错了什么,或者这里有一些特别的东西要学习!对不起,如果我写坏英语:(
在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)