2011-03-22 13 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。