为了账号安全,请及时绑定邮箱和手机立即绑定

Java中在foreach循环中调用Remove

Java中在foreach循环中调用Remove

小怪兽爱吃肉 2019-06-13 17:08:21
Java中在foreach循环中调用Remove在Java中,在使用foreach循环迭代集合时调用Remove是合法的吗?例如:List<String> names = ....for (String name : names) {    // Do something    names.remove(name).}作为增编,删除尚未重复的项目是否合法?例如,//Assume that the names list as duplicate entriesList<String> names = ....for (String name : names) {     // Do something     while (names.remove(name));}
查看完整描述

3 回答

?
幕布斯7119047

TA贡献1794条经验 获得超8个赞

为了在迭代集合时安全地删除集合,您应该使用Iterator。

例如:

List<String> names = ....Iterator<String> i = names.iterator();while (i.hasNext()) {
   String s = i.next(); // must be called before you can call i.remove()
   // Do something
   i.remove();}

Java文档 :

这个类的迭代器和listIterator方法返回的迭代器是快速失败的:如果列表在创建迭代器之后的任何时候进行了结构上的修改,那么除了通过迭代器自己的Remove或Add方法,迭代器将抛出一个ConcurrentModificationException。因此,在并发修改的情况下,迭代器会迅速而干净地失败,而不是在未来某个未定的时间冒着任意的、不确定的行为的风险。

也许许多新手不清楚的是,使用for/foreach构造对列表进行迭代会隐式地创建一个不可访问的迭代器。这个信息可以找到这里


查看完整回答
反对 回复 2019-06-13
?
收到一只叮咚

TA贡献1821条经验 获得超4个赞

你不会想那样做的。根据集合的不同,它可能导致未定义的行为。您想使用爱尔兰人直接。虽然每个构造都是语法糖,并且确实使用迭代器,但它对代码隐藏,因此您无法访问它来调用Iterator.remove.

如果基础集合在迭代过程中被修改,则迭代器的行为将不指定,除非调用此方法。

相反,编写代码:

List<String> names = ....Iterator<String> it = names.iterator();while (it.hasNext()) {

    String name = it.next();
    // Do something
    it.remove();}

注意,代码调用Iterator.remove,不是List.remove.

增编:

即使要移除尚未迭代的元素,仍然不希望修改集合,然后使用Iterator..它可能以一种令人惊讶的方式修改集合,并影响Iterator.


查看完整回答
反对 回复 2019-06-13
  • 3 回答
  • 0 关注
  • 1611 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信