Set集合,forEach遍历会导致无限循环问题

本文介绍了一种特殊情况下的Set集合遍历方法。当一个值在遍历过程中被删除并重新添加时,为避免重复访问同一值,建议创建新的Set集合进行遍历。文章通过实例展示了如何实现这一过程。

在调用forEach遍历Set集合的时候,如果一个值已经被访问过了,但是该值被删除被重新添加到集合,如果此时forEach循环并没有结束 那么该值会被重新访问 解决方法如下 重新构造另外一个Set集合并遍历它

// 在调用forEach遍历Set集合的时候,如果一个值已经被访问过了,但是该值被删除被重新添加到集合,如果此时forEach循环并没有结束
  // 那么该值会被重新访问 解决方法如下 重新构造另外一个Set集合并遍历它  const set = new Set([1])
  const newSet = new Set(set)
  newSet.forEach(item => {
    set.delete(1)
    set.add(1)
    console.log('我在遍历')
  })

可以参照https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Set/forEach

### 遍历 Set 集合的方式 在 Java 中,Set 集合是一种无序且元素唯一的数据结构,广泛应用于去重和快速查找的场景。由于其特性,遍历 Set 集合是开发中的常见需求。以下是几种常见的遍历方式,结合代码示例和原理分析。 #### 使用迭代器(Iterator)遍历 通过 `Iterator` 接口可以实现对 Set 集合遍历。这种方式是 Java 集合框架中通用的遍历方法之一。 ```java import java.util.HashSet; import java.util.Iterator; import java.util.Set; public class SetTraversal { public static void main(String[] args) { Set<String> set = new HashSet<>(); set.add("Apple"); set.add("Banana"); set.add("Cherry"); Iterator<String> iterator = set.iterator(); while (iterator.hasNext()) { System.out.println(iterator.next()); } } } ``` #### 使用增强型 For 循环遍历 增强型 For 循环(也称为 for-each 循环)是遍历 Set 集合的另一种简洁方式。 ```java import java.util.HashSet; import java.util.Set; public class SetTraversal { public static void main(String[] args) { Set<String> set = new HashSet<>(); set.add("Apple"); set.add("Banana"); set.add("Cherry"); for (String item : set) { System.out.println(item); } } } ``` #### 使用 Stream API 遍历 Java 8 引入了 Stream API,可以结合 `forEach` 方法实现更复杂的遍历逻辑。 ```java import java.util.HashSet; import java.util.Set; public class SetTraversal { public static void main(String[] args) { Set<String> set = new HashSet<>(); set.add("Apple"); set.add("Banana"); set.add("Cherry"); set.stream().forEach(System.out::println); } } ``` #### 使用 Lambda 表达式遍历 Lambda 表达式可以与 Stream API 结合使用,实现简洁且功能强大的遍历操作。 ```java import java.util.HashSet; import java.util.Set; public class SetTraversal { public static void main(String[] args) { Set<String> set = new HashSet<>(); set.add("Apple"); set.add("Banana"); set.add("Cherry"); set.forEach(item -> System.out.println(item)); } } ``` #### 使用 Stream API 进行过滤和映射遍历 Stream API 提供了 `filter` 和 `map` 等方法,可以实现更复杂的遍历逻辑。 ```java import java.util.HashSet; import java.util.Set; public class SetTraversal { public static void main(String[] args) { Set<String> set = new HashSet<>(); set.add("Apple"); set.add("Banana"); set.add("Cherry"); set.add("Date"); // 过滤长度大于 5 的元素并遍历 set.stream() .filter(item -> item.length() > 5) .forEach(System.out::println); // 输出: Banana, Cherry } } ``` #### 注意事项 在遍历过程中,需要注意以下几点: 1. **并发修改异常**:在遍历过程中,如果直接通过集合修改其结构(如添加或删除元素),可能会抛出 `ConcurrentModificationException` 异常。 2. **线程安全**:如果在多线程环境中遍历集合,需要确保集合的线程安全性。 3. **性能优化**:对于大数据量的集合,使用 Stream API 可能会带来一定的性能开销,需根据实际情况进行优化。 ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值