增强了循环空检查优化

时间:2014-09-02 14:16:41

标签: java for-loop

我知道用java一个人不应该打扰这样的事情,但我无法抗拒,哪个更快?:

ArrayList <Integer> keke = new ArrayList();
ArrayList <Integer> kuku = new ArrayList();
if(!keke.isEmpty()){
    for(Integer num : keke){
        System.out.println(num);
    }
}

//or just:

for(Integer num : kuku){
    System.out.println(num);
}

增强的for循环在开始做任何事情之前进行空检查?所以使用封闭if(空)是完全无用的?

2 个答案:

答案 0 :(得分:5)

  

增强的for循环在开始做任何事情之前进行空检查?

不,我不希望这样。我希望它只是创建迭代器,然后找不到任何东西。无论如何,JLS 14.14.2所描述的是:

  

增强的for语句相当于表单的基本for语句:

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

永远不会执行循环体。是的,它可能会创建一个无关的对象(迭代器),但在99.99%的情况下,我预计不会出现重要的性能损失。 (如上所述,iterator()方法可能会返回单例空迭代器以避免这种情况......)

如果你的特定应用程序中有证据,那么当集合为空时会非常频繁地触发,并且所有额外的迭代器都会导致问题,然后

答案 1 :(得分:3)

就像写作:

for(Iterator<Integer> itr = kuku.iterator(); itr.hasNext();) {
   ...
} 

正如您所看到的,检查它是否为空是多余的,因为hasNext将为false并且循环将不会被执行。