2015-12-21 105 views
0

我想了解迭代器設計模式,並在以下教程中找到。迭代java集合的性能高效方法是什麼?

http://www.journaldev.com/1716/iterator-design-pattern-in-java-example-tutorial

以下爲hasNext()next()方法的代碼。

@Override 
public boolean hasNext() { 
    while (position < channels.size()) { 
     Channel c = channels.get(position); 
      if (c.getTYPE().equals(type) ||  type.equals(ChannelTypeEnum.ALL)) { 
       return true; 
      } else 
       position++; 
     } 
    return false; 
} 

@Override 
public Channel next() { 
    Channel c = channels.get(position); 
    position++; 
    return c; 
} 

,並使用迭代方法收集以上是

while (baseIterator.hasNext()) { 
    Channel c = baseIterator.next(); 
    System.out.println(c.toString()); 
} 

如果我們使用hasNext()next()方法,它看起來就像我們使用while循環兩次。

當應用程序足夠小並且性能優先時,這是否正確?或者可以有優化的代碼?

回答

1

Iterator性能取決於它的實現。每個Java集合都有自己的迭代器實現,因此性能會有所不同。通常hasNextnext方法沒有循環。您展示的代碼是來自教程的一些特殊的迭代器,它在執行過濾時進行迭代。雖然您有兩個嵌套循環,但您實際上只會遍歷基本集合channels,因爲position會不斷從0增加到channels.size()。內部循環是跳過不需要的項目所必需的,但它不會增加計算難度。這種迭代的總體難度是O(channels.size())

請注意,此迭代器實現會破壞Iterator接口合同。首先它不會在迭代結束時拋出NoSuchElementException。其次,如果您撥打next()而不致電hasNext(),您將獲得不同的結果。因此,我不建議在實際代碼中使用本教程中的示例。

+0

感謝@Tagir Valeev的解釋,現在我真的好奇hasNext()和next()如何在Java集合中工作? –

+0

@AMY,檢查Java源代碼。例如,[這裏是](http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/8u40-b25/java/util/ArrayList.java#845)ArrayList迭代器。 –

+0

是的,我經歷了你建議的鏈接。 hasNext()方法中的代碼「return cursor!= size;」清除所有疑慮。 –

0

集合

如果channels是某種Iterable,那麼你可以,如果你正在使用的位置只迭代到寫環路

for(Channel c : channels) { 
    if(c.getTYPE().equals(type) 
    || type.equals(ChannelTypeEnum.ALL)) { 
     return true; 
    } 
} 
return false; 

無需增加位置下一個元素。

這只是簡寫 - 在註釋中使用迭代器的代碼 - 所以在性能方面不會獲得太多好處,但會增加代碼的清晰度。實現你的代碼做你自己迭代以上時並不需要,如果你已經channels類型爲一個Collection並實現Iterable

+0

這只是使用迭代器的編譯器速記 –

1

你是什麼意思「使用while循環兩次」?如果你擔心你是否在集合上迭代兩次,那麼它對我來說似乎並不是這樣。迭代器保持一個位置指針,這兩個方法似乎只是前進。所以雖然你有嵌套循環(一個在應用程序代碼,在hasNext()方法)他們不獲取相同的項目

+0

謝謝@sharonbn,我明白了你的觀點。位置指針繼續前進,hasNext()方法中的while循環沒有完全迭代。 –

相關問題