为什么此数组列表中的索引超出范围错误?

时间:2018-12-19 01:07:37

标签: 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 = 0; i < size; i++)
    if (list2.get(i) == 3 || list2.get(i) == 4)
    list2.remove(i);
System.out.println(list2);

1 个答案:

答案 0 :(得分:1)

第一个大小为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]

还没有删除4,为什么?

  • 因为当您检查索引2时会发现值3,因此将其删除,
  • 然后所有值都位于列表中,值4不在索引2上,
  • 由于i现在将是3,因此您无需选中该框

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

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