(點選上方公眾號,可快速關註)
ImportNew – MarkGZ
正如大家所知,迭代和列舉主要用於遍歷集合物件。列舉可以應用於Vector和Hashtable,迭代主要用於集合物件。
-
迭代與列舉的差異:
-
列舉比迭代快兩倍而且消耗更少的記憶體。
-
列舉更適合基本需求,而迭代是相對更安全,
-
因為在遍歷集合的時候,迭代器會阻止其他執行緒修改集合物件。
-
如果有其他執行緒要修改集合物件,會立即丟擲ConcurrentModificationException。
-
我們稱其為快速失敗迭代器,因為它快速,明瞭的丟擲了異常。
下麵是程式碼示例;
Vector
aVector = new Vector (); aVector.add(“I”);
aVector.add(“am”);
aVector.add(“really”);
aVector.add(“good”);
Enumeration
anEnum = aVector.elements(); Iterator
anItr = aVector.iterator(); // Traversal using Iterator
while(anItr.hasNext())
{
if (
) // This statement will throw ConcurrentModificationException.
// Means, Iterator won’t allow object modification while it is
// getting traversed. Even in the same thread.
aVector.remove(index);
System.out.println(anItr.next());
}
// Traversal using Enumeration
while(anEnum.hasMoreElements())
{
if (
) aVector.remove(index);
System.out.println(anEnum.nextElement());
}
但是迭代器提供了一種安全的方式,可以迭代過程中刪除從底層集合中的元素。
看下迭代器的實現。Collection的其他實現類支撐了這裡的remove()方法。
public interface Iterator
{
boolean hasNext();
Object next();
void remove(); // Optional
}
上面的程式可以重寫為:
while(anItr.hasNext())
{
System.out.println(anItr.next());
if (
) anItr.remove();
// Note:
// Before using anItr.remove(), the Iterator should
// point to any of its elements. The remove() removes the
// element which the Iterator corrently pointing to.
// Otherwise it will throw IllegalStateException
}
需要註意的是:Iterator.remove()是唯一一種可以在迭代過程中安全修改集合的方式。
在列舉中,沒有安全的方式可以在遍歷集合的時候刪除元素。
看完本文有收穫?請轉發分享給更多人
關註「ImportNew」,提升Java技能