Java 为什么此arraylist中存在索引越界错误?

Java 为什么此arraylist中存在索引越界错误?,java,arraylist,indexing,Java,Arraylist,Indexing,为什么这段代码会导致索引越界错误 ArrayList<Integer> list2 = new ArrayList<Integer>(); for (int i = 1; i <= 10; i++){ list2.add(i); //adding numbers to arraylist. Length is equal to 10 } int size = list2.size(); //size now equals 10 for (int i =

为什么这段代码会导致索引越界错误

ArrayList<Integer> list2 = new ArrayList<Integer>();

for (int i = 1; i <= 10; i++){
    list2.add(i); //adding numbers to arraylist.  Length is equal to 10
}
int size = list2.size(); //size now equals 10

for (int i = 0; i < size; i++)
    if (list2.get(i) == 3 || list2.get(i) == 4)
    list2.remove(i);
System.out.println(list2);
ArrayList list2=新的ArrayList();

对于(int i=1;i第一个大小是
10
,但是当您删除一个元素时,它会变成9,因此当索引
i
到达
9
时,您无法访问框9,因为它不存在(因为索引从
0
开始)


您需要在每次迭代修改时获得当前大小

for (int i = 0; i < list2.size(); i++) {
    if (list2.get(i) == 3 || list2.get(i) == 4) {
        list2.remove(i);
    }
}
//[1, 2, 4, 5, 6, 7, 8, 9, 10]
for(int i=0;i
而且
4
没有被删除,为什么

  • 因为当您检查索引
    2
    时,您会发现值
    3
    ,因此您会将其删除
  • 然后所有的值在列表中向下移动,值
    4
    不在索引
    2
  • 由于
    i
    现在将
    3
    您不会选中该框

要同时删除
3
4
,可以使用以下解决方案之一:

  • list2.removeIf(i->i==3 | | i==4);
  • list2=list2.stream()
    .filter(i->i!=3&&i!=4)
    .collect(收集器.toCollection(ArrayList::new));

从arraylist中删除项目,但从不更新
size
变量。因此在第一次
remove
之后,
size
太大。