为什么此代码会导致索引超出范围错误?
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);
答案 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
,因此您无需选中该框要同时删除3
和4
,可以使用以下解决方案之一:
list2.removeIf(i -> i == 3 || i == 4);
list2 = list2.stream()
.filter(i -> i != 3 && i != 4)
.collect(Collectors.toCollection(ArrayList::new));