2014-03-05 64 views
0

我們有對象的HashSet的:的Java迭代器hasNext()方法八方通假

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

當你修改它們引用的內容時,迭代器不能很好地工作 –

回答

2

IteratorHashSet類是快速失敗的迭代器後修改集合外部

http://docs.oracle.com/javase/tutorial/collections/interfaces/collection.html

迭代打破。從HashSet的類的文檔:

此類的iterator方法返回的迭代器是快速失敗的: 如果組隨時修改創建迭代器後,在 除了通過迭代的任何方式自己的刪除方法,迭代器 引發ConcurrentModificationException。因此,面對 併發修改,迭代器快速且乾淨地失敗,而不是在未來未確定的時間處冒任意的,不確定的行爲的風險。

這是Iterator internal implementation的一個很好的詳細解釋。

3

迭代器一旦創建就永遠不會改變 - 它只對集合中的元素有效。它不承認之後你創建了它,你添加了一個元素。在添加完所有元素後重新獲取迭代器。

0

見這樣的:如果你得到的迭代器