歡迎光臨
每天分享高質量文章

Java 迭代與列舉

(點選上方公眾號,可快速關註)


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技能

贊(0)

分享創造快樂