集合遍历时remove方法的问题

这是一道标准的Java数据结构面试题,重点是回答区别。

Collection接口的remove()方法本质上就是各个底层自己实现的remove()方法,其优点就是当其不是遍历的情况下,效率应该是最快的。但是其在遍历的情况下,将会导致各种问题,比如在现在 Collection c = new ArrayList();

那么无论是使用forEach还是fori方法都将导致一个致命的问题,ArrayList进行remove之后,所有的下标会前移一位,其将直接跳过remove的下一位,直接对其下下一位进行判断。

比如:

public static void remove(ArrayList<String> list)
{
    // list = {"b1","b2","b3"};
    for(inti=0;i<list.size();i++)
    {
        Strings=list.get(i);
        if(s.contains("b"))
        {
            list.remove(s);
        }
    }
    // 期待结果是 list = {};
    // 最终结果为 list = {"b2"}
}

如果list = {“b1”,“b2”,“b3”};

那么我们期望的是list = {};

但是实际运行结果将是:list = {“b2”};

因为其在删除 b1 之后,b2,b3 将会向前移动一位,但是下标依旧后移,所以直接删除b3,结束循环.

对于一个Collection类,我们在很多情况下甚至都不知道底层对象到底是谁,我们更希望底层实现自己实现遍历时删除的功能,为我们屏蔽掉各种各样的问题,而Iterator接口则定义了Collection遍历时锁需要的全部操作,所以其底层实现也都是在集合类内部实现,能够有效减少Bug和异常的产生。

所以我会这样告诉面试官:

Collection的remove适合于非遍历情况下的删除,直接调用底层自己实现的 
remove 方法,但是因为对底层实现的不了解,所以当其在遍历情况下,将导 
致异常或者BUG, 比如在ArrayList中,直接删除元素后,所有之后的元素会
向前移一位,如果不考虑清 楚,则可能会遗漏若干个对象的判断,而Iterator
的remove方法是由底层各个实现专 门 为遍历删除时提供的方法,其的安全性,
准确性,效率都高于Collection的remove()方法。

转载于 (https://blog.csdn.net/m0_37961948/article/details/88886010)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值