java的list remove_java之List集合调用remove方法慎用

有个业务,就是想要通过遍历把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);

}

报索引越界:

1984a0460517b924b67eaeac74e5de61.png

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值