为什么ArrayList输出的顺序是无序的?

11

我已经编写了一个Java程序,用于将整数添加到ArrayList中并从ArrayList中删除该整数,但它没有给我正确的结果。下面是我的代码:

public static void main(String args[])
  {
    ArrayList<Integer> a=new ArrayList<Integer>();

    a.add(6);
    a.add(7);
    a.add(8);
    a.add(9);

    for(int i=0;i<=a.size();i++)
    {

        System.out.println("Removed Elements=>"+a.remove(i));
    }
  }

它给我以下输出结果:

    Removed Elements=>6
Removed Elements=>8
Exception in thread "main" java.lang.IndexOutOfBoundsException: Index: 2, Size: 2
    at java.util.ArrayList.RangeCheck(ArrayList.java:547)
    at java.util.ArrayList.remove(ArrayList.java:387)
    at CollectionTemp.main(CollectionTemp.java:19)
为什么我得到了这样的输出?

5
在我看来,输出结果是正确的。你原本期望得到的是什么? - kiheru
1
这是一个关于如何解决这个问题的好帖子。 - krishnakumarp
2
用调试器逐步执行该代码可能是一个好主意,即使下面的答案已经解释了它。在每一步之后查看 a 的内容。 - hyde
@Pshemo 代码使用索引访问,没有并发修改发生,只是从无效的整数索引中删除。 - hyde
9
在迭代集合时请勿更改其内容,这是个不好的想法。 - rossipedia
显示剩余3条评论
13个回答

0
这是简单的逻辑:
第一次迭代 i=1:
a[0]=6,
a[1]=7,
a[2]=8;
a[3]=9;

删除 a[i]a[1] 删除了 7

第二次迭代 i=2:

a[0]=6
a[1]=7
a[2]=9

移除a[i]将移除9


0

你的输出是正确的:这是解释。

当循环第一次执行时,i的值将为1。并且它执行语句a.remove(1)。在删除位于a[1]处的值7之后,“8将在a[1]的位置。之后i被增加并变为2,然后它删除元素a[2],即9


0

每当您从ArrayList中删除一个元素时,它会删除指定位置的元素。每次ArrayList的大小减小时都应该注意这一点。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接