如何遍历一个Set
/ HashSet
不包含以下内容?
Iterator iter = set.iterator();
while (iter.hasNext()) {
System.out.println(iter.next());
}
31
您实际上是在尝试避免使用迭代器,还是只是不想在源代码中看到它?
—
乔恩·斯基特
您可以使代码更短,更清晰,但是必须使用Iterator。您有避免的理由吗?
—
彼得·劳瑞
仅作记录并解释为什么避免迭代器:我目前在用Java编写的Android游戏中遇到该问题。现在,我正在使用HashSet来存储需要定期通知事件的侦听器。但是,重复迭代收集会导致大量的垃圾收集器活动,从而增加游戏循环的负担。这在Java游戏中是徒劳的。我将重写这些部分。
—
tiguchi 2013年
@thecoshman我只是从Java游戏开发的角度出发,在这种情况下,您不惜一切代价避免在常规游戏状态更新期间避免使用GC。迭代器只是临时有用的对象,因为您无法将其重置为开始,因此在每次迭代方法调用时都会重新创建它们(例如,请参见ArrayList.java源)。如果在游戏循环中用于迭代场景对象并考虑每秒至少进行30次更新,则最终在内存中至少每秒有60个迭代器对象(场景通常每个循环迭代两次),等待GC。这对Android产生了重大影响。
—
tiguchi 2014年
在这种情况下,也许应该选择一种更合适的数据结构?集合的设计目的不是有效地进行迭代。为什么不使用ArrayList并使用标准的for循环对其进行迭代?没有创建其他迭代器,读取访问非常快。
—
stef77