Java中在foreach循环中调用Remove

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));}


小怪兽爱吃肉
浏览 1615回答 3
3回答

幕布斯7119047

为了在迭代集合时安全地删除集合,您应该使用Iterator。例如:List<String>&nbsp;names&nbsp;=&nbsp;....Iterator<String>&nbsp;i&nbsp;=&nbsp;names.iterator();while&nbsp;(i.hasNext())&nbsp;{ &nbsp;&nbsp;&nbsp;String&nbsp;s&nbsp;=&nbsp;i.next();&nbsp;//&nbsp;must&nbsp;be&nbsp;called&nbsp;before&nbsp;you&nbsp;can&nbsp;call&nbsp;i.remove() &nbsp;&nbsp;&nbsp;//&nbsp;Do&nbsp;something &nbsp;&nbsp;&nbsp;i.remove();}从Java文档&nbsp;:这个类的迭代器和listIterator方法返回的迭代器是快速失败的:如果列表在创建迭代器之后的任何时候进行了结构上的修改,那么除了通过迭代器自己的Remove或Add方法,迭代器将抛出一个ConcurrentModificationException。因此,在并发修改的情况下,迭代器会迅速而干净地失败,而不是在未来某个未定的时间冒着任意的、不确定的行为的风险。也许许多新手不清楚的是,使用for/foreach构造对列表进行迭代会隐式地创建一个不可访问的迭代器。这个信息可以找到这里

收到一只叮咚

你不会想那样做的。根据集合的不同,它可能导致未定义的行为。您想使用爱尔兰人直接。虽然每个构造都是语法糖,并且确实使用迭代器,但它对代码隐藏,因此您无法访问它来调用Iterator.remove.如果基础集合在迭代过程中被修改,则迭代器的行为将不指定,除非调用此方法。相反,编写代码:List<String>&nbsp;names&nbsp;=&nbsp;....Iterator<String>&nbsp;it&nbsp;=&nbsp;names.iterator();while&nbsp;(it.hasNext())&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;name&nbsp;=&nbsp;it.next(); &nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;Do&nbsp;something &nbsp;&nbsp;&nbsp;&nbsp;it.remove();}注意,代码调用Iterator.remove,不是List.remove.增编:即使要移除尚未迭代的元素,仍然不希望修改集合,然后使用Iterator..它可能以一种令人惊讶的方式修改集合,并影响Iterator.
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java