我正在尝试练习,我会向一个arraylist添加1000个元素,然后再次从列表中系统地删除它们(通过指定索引)。这背后的想法是比较LinkedList和ArrayList的性能。
int totalObjects = 0;
for(int i = 0; i < 1000; i++)
{
totalObjects += 1;
al.add("Object " + totalObjects);
}
System.out.println("The Arraylist size is " + al.size());
如果我执行以下操作,只会删除一半的元素......为什么会这样?
for(int index = 0; index < al.size(); index++)
{
al.remove(index);
}
System.out.println("The Arraylist size after removal is " + al.size());
亲切的问候
阿里安
答案 0 :(得分:12)
这是因为您通过删除来改变索引。如果删除元素0,则元素1现在变为元素0.现在,当您下一次删除1时,这就是过去的元素2,而元素1仍然存在于索引0处。
避免这种情况的最简单方法是从头到尾循环。
或者,您可以继续删除索引0,直到ArrayList为空。
答案 1 :(得分:8)
请注意,您只需使用clear()
方法即可立即删除所有元素。在您的代码中,问题是列表在您迭代它的同时被修改,从而有效地减小了它的大小,因此index < al.size()
条件失败。试试这个:
for (int index = 0, n = al.size(); index < n; index++)
al.remove(0);
或者,此解决方案最后删除元素,使其更有效(不再需要复制元素):
for (int idx = al.size() - 1; idx >= 0; idx--)
al.remove(idx);
答案 2 :(得分:2)
因为在从ArrayList
删除元素时,正在更新其索引。因此,您删除位置0处的元素,位置1中的元素现在位于索引0位置。因此,当您删除索引1处的元素时,您将在原始ArrayList
的索引2处移除元素,依此类推。
答案 3 :(得分:2)
通过循环查看再次删除元素的位置。每当你删除元素时,al.size()返回的值减少,而你的索引增加。这意味着你只会迭代一半的时间。
修复就是这样做。
int size = al.size();
for(int index = 0; index < size; index++ ) {
然后去做。这样大小不会改变。
要记住的另一件事是,当您从索引0处的arraylist中删除某些内容时,索引1将变为索引0.因此,从
进行迭代可能更好int index = al.size(); index >=0 ; index--
答案 4 :(得分:1)
删除项目时,它会收缩合同。
假设您有项目0 1和2
您的索引是0
你删除0,你的索引现在是1,你删除2,因为它现在在索引1。
有道理吗?
答案 5 :(得分:1)
通常只有一半的列表为空,因为当您从列表中删除元素时,列表的大小会减小,但索引会增加。他们在中间见面。如果你真的想逐个删除元素,并从最后一个元素删除到第一个元素。我建议你使用:
while (!al.isEmpty())
{
al.remove(al.indexOf(al.size()-1));
}