2011-03-22 18 views
2

在下面的代碼片段中,檢查dic.isEmpty()是否會導致任何的性能改進?在輸入while(Iterator.hasNext())循環之前Map.isEmpty()是否有意義?

for (Map<String, String> dic : dics) { 
     if (!dic.isEmpty()) { 
     Iterator<Map.Entry<String, String>> it = dic.entrySet().iterator(); 
     while (it.hasNext()) { 
      Map.Entry<String, String> pair = it.next(); 
      Log.d("Substitute", pair.getKey() + " => " + pair.getValue()); 
     } 
     } 
    } 

畢竟,如果地圖/ DIC是空的,而()循環將不進入,所以它看起來像支票dic.isEmpty()是多餘的 - 除非有一些其他的理由它?

回答

2

這是一種嘗試過早優化代碼。

您的地圖或者總是要爲空或不爲空:

  1. 如果爲空,然後返回回一個「無項目」的迭代器很可能會回到背面,同樣靜態的「空迭代」 (Collections.EmptyIterator),所以對內存的影響是可以忽略的。

  2. 如果它已滿,那麼檢查只會減慢對所需迭代器的訪問速度。

的主要問題是,它可能招致的競爭條件,如果另一個線程檢查空和迭代器的搶之間增加了項目。也就是說,返回null迭代器的代價可能可以忽略不計(很多調優集合返回一個singleton null迭代器),所以額外的檢查是過度的。

+0

您的回覆沒有問題,但您的意思可能是「如果另一個線程刪除了項目並在空白檢查和迭代器抓取之間爲空」 – sactiw 2013-04-09 16:24:42

+0

@sactiw是的,你說得很對。我的措辭需要在兩行之間進行閱讀,並感謝您填寫「行間」。 – 2013-04-10 13:58:38

2

它是多餘的。我會說,離開它。這聞起來過早的微觀優化。

由於在這種情況下不應該將空映射視爲特殊情況,因此isEmpty只會混淆代碼imo。