【发布时间】:2020-05-30 03:28:00
【问题描述】:
我知道集合没有重复项,但问题是我无法在使用迭代器或针对每个循环对其进行迭代时向其中添加元素。还有其他方法吗?谢谢。
【问题讨论】:
-
看看this answer on a different question。编码应该不会太难,所以不会重复。
标签: java data-structures iterator set
我知道集合没有重复项,但问题是我无法在使用迭代器或针对每个循环对其进行迭代时向其中添加元素。还有其他方法吗?谢谢。
【问题讨论】:
标签: java data-structures iterator set
ConcurrentHashMap 类可用于此目的。例如:
Set<T> set = Collections.newSetFromMap(new ConcurrentHashMap<T, Boolean>());
(您可以将<T, Boolean> 替换为<> 并让编译器推断类型。出于说明目的,我按上述方式编写。)
Collections::newSetFromMapjavadoc 说:
返回由指定映射支持的集合。结果集显示与支持映射相同的排序、并发性和性能特征。本质上,这个工厂方法提供了一个
Set实现,对应于任何Map实现。
由于ConcurrentHashMap 允许同时迭代和更新,所以上面生成的Set 也是如此。问题是迭代可能看不到在迭代时添加或删除的效果。
迭代的并发属性可以从javadoc 中推断出ConcurrentHashMap。
还有没有其他办法。
这取决于您的要求,但有一些潜在的方法可以避免该问题。例如,您可以:
但是,如果没有并发瓶颈(例如 1.)或行为差异(例如 2.),这些都不太可能工作
【讨论】:
不确定以下方法是否能解决您的问题,但您可以尝试:
HashSet<Integer> original = new HashSet<>();
HashSet<Integer> elementsToAdd = new HashSet<>();
elementsToAdd.add(element); //while iterating original
original.addAll(elementsToAdd); //Once done with iterating, just add all.
【讨论】: