2011-09-07 22 views
2
Stack<String> sk = new Stack<String>(); 

sk.push("Hello"); 
sk.push("Hello1"); 
sk.push("Hello2"); 

我有兩種方法來迭代此堆棧對象。使用迭代器接口或Java中的每個語句

for(String s : sk){ 
    System.out.println("The Values of String in SK" +sk); 
} 

//方式二..

Iterator<String> it=sk.iterator(); 
    while(it.hasNext()) 
    { 
     String iValue=(String)it.next(); 
     System.out.println("Iterator value :"+iValue); 
    } 
  1. 的是這兩者之間的區別?
  2. 任何優勢,如果我選擇其中之一?
  3. 哪個是迭代的首選方式?

回答

2

1.這兩者有什麼區別?

並不多。 for-each循環結構實際上依賴於窗簾後面的迭代器。

延伸閱讀:

2.任何優勢,如果我選擇其中的一個?

大部分可讀性我會假設。

(如果您需要訪問iterator.remove()方法,那麼顯然你需要去明確Iterator方法)。但是,請記住,這是一個可選操作,不得由基礎Stack實現你」支持重新使用。

此外,一個Stack結構的一點是你不要刪除中間的元素。

3.哪個是迭代的首選方法?

如果這對您有用,請使用for-each方法。

4

Iterator的優點是您可以在迭代時從集合中刪除元素。那裏可能會拋出ConcurrentModificationExceptions

如果您不需要,我更喜歡前一種方式,因爲它更易於閱讀。

+2

如果他需要從集合中間刪除元素,他爲什麼要使用'Stack'? – aioobe

2

Iterator如果在循環播放列表時修改列表,則可以防止出現java.util.ConcurrentModificationExceptionIterator.remove()

1

選擇之間對於每個和Iterator只是一個方便的問題。對於每個循環來說,看起來有點神祕,特別是那些習慣於傳統循環的人。然而Iterator s的缺點是,您必須將Objectnext()轉換爲適當的類型,儘管您的收藏沒有輸入。對於每一件事,一切都發生在幕後。

+2

實際上,由於java 1.5,迭代器是通用的,因此如果您向集合和迭代器添加適當的泛型參數,則不需要強制轉換 –

+0

@Arnout正確的,我忘了這一點。感謝您指出! – asgs

2

有效的Java,由約書亞·布洛克:

for環,在其傳統和for-each表單,允許您聲明循環 變量,限制其範圍到他們需要的確切區域。 (此 區域由循環體以及初始化,測試的,並更新 主體前述)。因此,喜歡for循環來while環路,假設循環變量的 內容不需要循環結束後。

要長話短說:

  • for-each環路總是類型安全

  • for-each循環是不容易複製/粘貼錯誤(複製/粘貼的iterator1兩次你的代碼!)

  • for-each loop允許你mi最小化局部變量的範圍

  • for-each循環更容易閱讀!

綜上所述,喜歡for-each循環來while循環當你沒有明確需要while循環。