2012-06-25 76 views
13

Iterator中Sun添加了remove方法來刪除集合的最後訪問元素。爲什麼沒有添加方法將新元素添加到集合中?集合或迭代器可能會產生哪些副作用?迭代器接口中爲什麼沒有添加方法

+0

我認爲你有一個重複: http://stackoverflow.com/questions/993025/java-adding-elements-to-a-collection-during-iteration – mihaisimi

+0

@mihaisimi - 不,這是真是一個不同的問題。 –

+0

是的,你是對的。仍然coobird提供了一個很好的答案在這個線程上。 – mihaisimi

回答

10

Iterator的唯一目的是枚舉集合。所有收藏包含add()方法來滿足您的目的。添加迭代器是沒有意義的,因爲集合可能會或可能不會被訂購(在HashSet的情況下)。

編輯:在處理另一個問題時,我想出了另一個原因Iterator缺少add()方法。在ArrayList(第111行)和HashMap(第149行)的引擎下,我們看到實現只是圍繞一組對象的幾個方法。現在我們考慮如何在內存中處理數組。

zero-based array indexes

這是5個元素的陣列。但是,有六個指數。這個數組中的字母「a」被列爲元素0,因爲爲了讀取它,像計算機一樣從左到右,你必須從索引0開始。現在,如果我們遍歷這個數組(是的,集合,但它歸結爲一個數組),我們將從索引0開始並繼續索引1.在Iterator的這一點上,我們想要調用add("f");。在這一點上,我們來比較add()remove()的含義。 remove()會在數組中留下空間,這很容易跳過,因爲我們可以立即認識到它不是成員。另一方面,add()會提出一個新的元素,其中不存在之前。這將影響我們正在迭代的數組的長度。當我們到達最後的元素時會發生什麼?我們甚至可以保證它在那裏(也就是說,陣列沒有超過the maximum size)?

總而言之,這兩種參數都有效,但底線是在所有情況下,方法的行爲都沒有很好的定義。 Sun必須選擇在哪裏限制功能,並且他們選擇不包含這種方法。

+0

「因爲收集可能會或可能不會被訂購」 - 請您詳細說明一下。謝謝 – droidsites

+0

我收到你的陳述:-)。謝謝 – droidsites

+0

HashSet不保證其成員的順序。如果您正在遍歷它以嘗試找到插入值的位置,那麼您剛剛擊敗了Iterator的重點。 – gobernador

0

我想不出任何理論上的原因,爲什麼add()不能包含在Iterator中。正如Iterator可以允許通過自身從集合中移除元素一樣,它可以被設計爲處理以相同方式添加的元素。

但我會說在我所有的Java編程年 - 超過15年! - 我從來不想要Iterator.add()方法。所以我懷疑這並不是那麼有用。

5

如果您正在使用列表,您可以使用ListIterator,它提供了添加和刪除操作。

+3

實際上不回答問題。但是,是的,'Iterator'沒有實現'add',因爲它不是'ListIterator'。 – Robert

0

迭代器有一個指針指向唯一的下一個元素。 ListIterator也有指向前一個元素的指針(記住,它可以向後遍歷)。

相關問題