2014-07-16 28 views
0

據瞭解,mapX中只有一個條目。代碼度量工具抱怨在循環中使用'break',但通常在這樣一個小循環中,我會讓它通過。但在這種情況下,由於它只有一個入口,我不確定哪一個更有效。for/break比iterator()更有效率next()?

因此,當您知道地圖只包含一個元素時,以下哪一項更有效?

可能替代:

Map.Entry<String,String> e = mapX.entrySet().iterator().next(); 
Y.setMsg(e.getValue()); 
Y.setMsgKey(e.getKey()); 

原始代碼:

for (String key : mapX.keySet()){ 
    Y.setMsg(mapX.get(key)); 
    Y.setMsgKey(key); 
    break; 
} 
+0

如何不使用? – ThreeFx

+5

爲什麼你有一張地圖?如果只有一個入口? – azurefrog

+0

@azurefrog你從我嘴裏說出的話。 – csmckelvey

回答

4

第一版本比所述第二個更快(與「for」循環/「斷」):

  1. 環路版本具有調用next()之前調用hasNext()
  2. 循環版本迭代keySet而不是entryset,因此必須執行額外的映射查找以獲取相應的值。
  3. 循環版本可能有一個額外的分支指令在break ...雖然這是很小的,並可能由JIT編譯器優化。

使用第一個版本(IMO)的最佳理由是代碼更容易理解/更簡單。 (代碼度量工具在這種情況下有幫助...)


當然,翻蓋面是,如果該映射爲空,代碼的非循環版本會拋出一個異常。如果您需要處理「空白地圖」的情況下,你應該這樣寫:

if (!mapX.isEmpty()) { 
    Map.Entry<String,String> e = mapX.entrySet().iterator().next(); 
    y.setMsg(e.getValue()); 
    y.setMsgKey(e.getKey()); 
} 
+0

也循環版本有一個額外的地圖查找。如果它使用了entrySet(),那麼描述將是準確的。 – jtahlborn

+0

我沒有注意到... fixed –

+0

我自己喜歡iterator()。next()版本,但不確定是否可能有其他原因使用for循環。謝謝! – EdwinW

0

我個人覺得第1種更簡潔。如果您使用guava,你也可以寫這樣的:

Map.Entry<String,String> e = Iterables.getOnlyElement(mapX.entrySet()); 
0

Map.Entry<String,String> e = mapX.entrySet().iterator().next(); 
Y.setMsg(e.getValue()); 
Y.setMsgKey(e.getKey()); 

相同

for (String key : mapX.keySet()){ 
    Y.setMsg(mapX.get(key)); 
    Y.setMsgKey(key); 
    break; 
} 

有一個例外:循環首先調用hasNext()在迭代器上。

前者意味着更強烈地意味着只有一個元素(至少只有一個你感興趣)。後者說:「我要循環所有元素,除非我會在第一個元素之後停止。」爲什麼使用循環,如果你不打算循環?

似乎非循環版本是一個去。