在Iterator
中Sun添加了remove方法來刪除集合的最後訪問元素。爲什麼沒有添加方法將新元素添加到集合中?集合或迭代器可能會產生哪些副作用?迭代器接口中爲什麼沒有添加方法
回答
Iterator的唯一目的是枚舉集合。所有收藏包含add()
方法來滿足您的目的。添加迭代器是沒有意義的,因爲集合可能會或可能不會被訂購(在HashSet
的情況下)。
編輯:在處理另一個問題時,我想出了另一個原因Iterator
缺少add()
方法。在ArrayList
(第111行)和HashMap
(第149行)的引擎下,我們看到實現只是圍繞一組對象的幾個方法。現在我們考慮如何在內存中處理數組。
這是5個元素的陣列。但是,有六個指數。這個數組中的字母「a」被列爲元素0,因爲爲了讀取它,像計算機一樣從左到右,你必須從索引0開始。現在,如果我們遍歷這個數組(是的,集合,但它歸結爲一個數組),我們將從索引0開始並繼續索引1.在Iterator的這一點上,我們想要調用add("f");
。在這一點上,我們來比較add()
和remove()
的含義。 remove()
會在數組中留下空間,這很容易跳過,因爲我們可以立即認識到它不是成員。另一方面,add()
會提出一個新的元素,其中不存在之前。這將影響我們正在迭代的數組的長度。當我們到達最後的元素時會發生什麼?我們甚至可以保證它在那裏(也就是說,陣列沒有超過the maximum size)?
總而言之,這兩種參數都有效,但底線是在所有情況下,方法的行爲都沒有很好的定義。 Sun必須選擇在哪裏限制功能,並且他們選擇不包含這種方法。
「因爲收集可能會或可能不會被訂購」 - 請您詳細說明一下。謝謝 – droidsites
我收到你的陳述:-)。謝謝 – droidsites
HashSet不保證其成員的順序。如果您正在遍歷它以嘗試找到插入值的位置,那麼您剛剛擊敗了Iterator的重點。 – gobernador
我想不出任何理論上的原因,爲什麼add()
不能包含在Iterator
中。正如Iterator
可以允許通過自身從集合中移除元素一樣,它可以被設計爲處理以相同方式添加的元素。
但我會說在我所有的Java編程年 - 超過15年! - 我從來不想要Iterator.add()
方法。所以我懷疑這並不是那麼有用。
如果您正在使用列表,您可以使用ListIterator,它提供了添加和刪除操作。
實際上不回答問題。但是,是的,'Iterator'沒有實現'add',因爲它不是'ListIterator'。 – Robert
好了,我們開始吧:
答案在設計常見問題作了明確規定:
你爲什麼不提供一個Iterator.add方法?
由於Iterator的合約對迭代次序沒有任何保證,所以語義不清楚。但請注意,ListIterator確實提供了添加操作,因爲它確實保證了迭代的順序。
http://docs.oracle.com/javase/1.4.2/docs/guide/collections/designfaq.html#10
迭代器有一個指針指向唯一的下一個元素。 ListIterator也有指向前一個元素的指針(記住,它可以向後遍歷)。
- 1. RandomAccess接口,爲什麼沒有方法?
- 2. 爲什麼迭代器沒有任何重置方法?
- 3. 爲什麼std :: pair沒有迭代器?
- 4. 爲什麼添加的結果沒有在迭代中捕獲?
- 5. python迭代器的接口是什麼?
- 6. Laravel接口迭代器沒有發現
- 7. 點迭代器的Wierd接口方法
- 8. 迭代器接口和方法
- 9. 爲什麼JsArrayString沒有實現迭代?
- 10. 迭代器接口
- 11. 爲什麼Java中沒有「Equlable」接口?
- 12. 爲什麼沒有RelatedManager.add()接受一個迭代作爲參數?
- 13. 在PEP 3141中,爲什麼Number沒有添加方法?
- 14. 當沒有容器時作爲迭代器返回什麼?
- 15. 爲什麼PHP有迭代器對象?
- 16. 迭代器沒有getNextElement方法直接移動光標
- 17. Go結構作爲方法接收器有和沒有接口
- 18. 爲什麼沒有故障安全迭代器拋出ConcurrentModificationException?
- 19. 爲什麼沒有SqlDataReader.ReadAsync()的接口
- 20. 什麼是沒有方法的空接口的用法?
- 21. Selenium中有沒有窗口迭代的替代方案?
- 22. C++ STL迭代器接口
- 23. C++ 11迭代器接口
- 24. PHP,迭代器接口
- 25. 爲什麼接口默認方法?
- 26. 方法迭代器和視圖之間有什麼區別?
- 27. 爲什麼沒有這種方法的接收器?
- 28. 爲什麼有兩種方法可以迭代Vector,IntoIterator和Iter?
- 29. 爲什麼GLSurfaceView.Renderer中沒有onSurfaceDestroyed方法?
- 30. 爲什麼不允許添加toString()作爲默認方法的接口?
我認爲你有一個重複: http://stackoverflow.com/questions/993025/java-adding-elements-to-a-collection-during-iteration – mihaisimi
@mihaisimi - 不,這是真是一個不同的問題。 –
是的,你是對的。仍然coobird提供了一個很好的答案在這個線程上。 – mihaisimi