我们有一个HashSet对象:
private Set<Client> clients = new HashSet<Client>();
它的迭代器:
private Iterator<Client> iterator = clients.iterator();
让我们将对象添加到该集合并打印出迭代器hasNext
方法输出:
Client client = new Client(name);
clients.add(client);
System.out.println(iterator.hasNext());
输出为:“false
”。为什么呢?
答案 0 :(得分:3)
迭代器一旦创建就永远不会改变 - 它只适用于你获得它时集合中的元素。它无法识别在之后创建它,您添加了一个元素。只需在添加完所有元素后重新获取迭代器。
答案 1 :(得分:2)
Iterator类的HashSet是一个快速失败的迭代器。从HashSet类的文档:
此类的迭代器方法返回的迭代器是快速失败的: 如果在创建迭代器后的任何时间修改了该集,则 除了通过迭代器自己的删除方法,Iterator之外的任何方式 抛出ConcurrentModificationException。因此,面对 并发修改,迭代器快速干净地失败, 而不是冒着任意的,非确定性的行为冒险 未来不确定的时间。
以下是Iterator internal implementation的详细解释。
答案 2 :(得分:0)
见:
http://docs.oracle.com/javase/tutorial/collections/interfaces/collection.html
如果在获取迭代器
后从外部修改集合,则迭代器会中断