有个业务,就是想要通过遍历把list集合中的数据删除掉,如下做法是不可能把list集合删除干净的:
public static void main(String[] args) {
List list = new ArrayList<>();
list.add("aa");
list.add("bb");
list.add("cc");
list.add("dd");
list.add("ee");
/**
* 下面遍历操作过程如下:
* i = 0 list.size() == 5 执行完第一次list.remove(0); list剩下[bb,cc,dd,ee]
* i = 1 list.size() == 4 执行完第二次list.remove(1); list剩下[bb,dd,ee]
* i = 2 list.size() == 3 执行完第三次list.remove(2); list剩下[bb,dd]
* i = 3 list.size() == 2 i > list.size()所以条件不满足,最后剩下[bb,dd]
*/
for (int i = 0; i< list.size(); i++) {
list.remove(i);
}
System.out.println(list); // 最终打印出来的结果是[bb,ee]
}
再有这种也是不行的,如:
public static void main(String[] args) {
List list = new ArrayList<>();
list.add("aa");
list.add("bb");
list.add("cc");
list.add("dd");
list.add("ee");
/**
* 下面遍历操作过程如下:
* i = 0 list.size() == 5 执行完第一次list.remove(0); list剩下[bb,cc,dd,ee]
* i = 1 list.size() == 4 执行完第二次list.remove(0); list剩下[cc,dd,ee]
* i = 2 list.size() == 3 执行完第三次list.remove(0); list剩下[dd,ee]
* i = 3 list.size() == 2 i > list.size()所以条件不满足,最后剩下[dd,ee]
*/
for (int i = 0; i< list.size(); i++) {
list.remove(0);
}
System.out.println(list); // 最终打印出来的结果是[bb,ee]
}
关键点就是因为每次list.size()都会重新计算长度才会导致问题出现
于是解决问题就是提取获取长度的关键点出来如下:
public static void main(String[] args) {
List list = new ArrayList<>();
list.add("aa");
list.add("bb");
list.add("cc");
list.add("dd");
list.add("ee");
/**
* 下面遍历操作过程如下:
* i = 0 len == 5 执行完第一次list.remove(0); list剩下[bb,cc,dd,ee]
* i = 1 len == 5 执行完第二次list.remove(0); list剩下[cc,dd,ee]
* i = 2 len == 5 执行完第三次list.remove(0); list剩下[dd,ee]
* i = 3 len == 5 执行完第四次list.remove(0); list剩下[ee]
* i = 4 len == 5 执行完第五次list.remove(0); list剩下[]
*/
int len = list.size(); // 保证只获取一次长度
for (int i = 0; i< len; i++) {
list.remove(0);
}
System.out.println(list); // 最终打印出来的结果是[bb,ee]
}
特别注意的是:
如果是这样就会报错了
public static void main(String[] args) {
List list = new ArrayList<>();
list.add("aa");
list.add("bb");
list.add("cc");
list.add("dd");
list.add("ee");
/**
* 只求取list.size()长度一次
* i == 0 len == 5 list.remove(0) list剩下["bb","cc","dd","ee"]
* i == 1 len == 5 list.remove(1) list剩下["bb", "dd","ee"]
* i == 2 len == 5 list.remove(2) list剩下["bb","dd"]
* i == 3 len == 5 list.remove(3) list因为没有第四个元素,于是报索引越界错误
*/
int len = list.size();
for (int i = 0; i < len; i++) {
list.remove(i);
}
System.out.println(list);
}
报索引越界: