在进入while(Iterator.hasNext())循环之前,Map.isEmpty()是否有意义?

时间:2011-03-22 15:39:32

标签: java map

在以下代码段中,检查dic.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());
        }
      }
    }

毕竟,如果map / dic为空,则不会输入while()循环,所以看起来对dic.isEmpty()的检查是多余的 - 除非有其它理由吗?

2 个答案:

答案 0 :(得分:2)

这是多余的。我会说,把它留下来。这有点过早的微观优化。

由于在这种情况下不应将空地图视为特殊情况,isEmpty只会使代码imo混乱。

答案 1 :(得分:2)

尝试过早优化代码。

您的地图要么总是空的,要么不是空的:

  1. 如果它为空,则返回“无项目”迭代器可能会返回相同的静态“空迭代器”(Collections.EmptyIterator),因此对内存的影响可以忽略不计。

    < / LI>
  2. 如果已满,则检查只会减慢对所需迭代器的访问速度。

  3. 主要问题是如果另一个线程在检查为空和抓取迭代器之间添加项目,它可能会招致竞争条件。也就是说,返回null迭代器的成本很可能是微不足道的(许多调优集合返回一个单独的null迭代器),因此额外的检查是过度的。