Java - 為什麼 Iterator 不提供 add(E)方法 ?

古古

2018/12/06


  • 為什麼 Iterator 接口,只有 hasNext()next()remove() 方法,而沒有 add(E) 方法 ?
    • 邏輯上來說,迭代器是一個一個去遍歷集合中的元素,而當前 iterator 停下的地方,就是迭代到一半的地方
      • 如果當迭代到一半時調用 iterator.add() 方法,理論上來說,應該是要在當前這個元素 E1 後面新增一個元素 E2,使得下次遍歷此集合時,E2 一定會出現在 E1 後面,也就是 [….E1, E2, ….]
      • 假設 add() 方法是以這個語意為前提的話,那麼迭代器不提供此方法是很合理的,對於有序的集合(像是ArrayList)來說,在此元素後面新增一個元素是一個很簡單的事情,但是對於無序的集合(像是HashSet)來說,不能保證新插入的這個元素 E2 一定會在 E1 後面(因為還得計算 HashCode),如此就違反了 add() 的語意了,這也就是為什麼 Iterator 接口不提供 add() 方法
    • 另一個說法是,在使用迭代器時,通常就是 “遍歷” 的場景,這種場景下很少會去使用 add() 方法,因此 Iterator 接口沒必要提供這個方法