2012-02-20 61 views
3

我是用JProfiler我的應用程序的分析任何關係,因爲它是一個巨大的應用程序,所以我很清楚它的性能和效率。
需要太長時間才能將所有Iterator.hasNext替換爲for-each,但是當我在JProfilers CPU視圖中看到它時,它向我顯示Iterator.hasNext方法,我在此使用for-each
爲什麼這樣做?這兩者之間有什麼關係? 下面是示例代碼:有Iterator.hasNext之間for-each循環

List<Map<String, Object>> mapList = jdbcTemplate 
         .queryForList(MAP.SELECT_ALL); 
       for (Map<String, Object> map : mapList) { 
      list.add(fillPreferenceMaster(preferenceMasterMap)); 
} 
+0

http://stackoverflow.com/questions/2113216/which-is-more-efficient-a-for-each-loop-or-an-iterator生成字節碼時它們是相同的東西 – Sean 2012-02-20 06:00:58

回答

10

是,增強for語句使用Iterator下的圈蓋的迭代集合,看到Section 14.14.2 of the JLS

如果表達的類型是子類型的Iterable,然後讓我表達表達.iterator()的類型。增強for聲明等效於以下形式的基本for語句:

for (I #i = Expression.iterator(); #i.hasNext();) { 
     VariableModifiersopt Type Identifier = #i.next(); 
    Statement 
} 

#i是一個編譯器生成的標識符是從任何其他標識符(編譯器生成或以其它方式),其在範圍不同(§ 6.3)在發生增強for聲明的位置。

0

的換每個語句使用迭代器遍歷您的收藏。編譯器用while循環替換你的for-each。

2

的換每個Java循環使用底層迭代器機構。所以要回答你的問題,代碼是相同的。

這是最有可能不是你的代碼的瓶頸。您應該使用JProfiler確定前10個方法熱點,並找出如何優化這些方法調用。

+0

我正在這樣做但大部分時間都是通過jsp方法進行的,並且它們以非常奇怪的方式可見。 我不知道哪個標籤需要太多時間...... – 2012-02-20 06:33:26