在
Java循环中,使用布尔标志而不是if语句是否更有效?
看看这两行代码.
使用标志:
public boolean isSomethingForAnyone() { boolean flag = false; for (Item item : listOfItems) { flag = flag || item.isSomething(); } return flag; }
使用if语句:
public boolean isSomethingForAnyone() { for (Item item : listOfItems) { if (item.isSomething()) return true; } return false; }
如果isSomething()在第一次迭代时返回true,则使用if语句的方法当然会更快.但是,它的平均速度是否更快,或者分支是否足够慢以至于速度较慢?另外,如果循环更快,情况会有所不同吗?为了简单起见,我在这里使用了for-each循环,我认为这比使用计数器迭代数组要慢.
解决方法
这两段代码并不完全相同.
即使您只需要多次调用item.isSomething()(与我原来的答案相反),第一个版本仍然会继续尝试迭代集合的其余部分.
想象一下Item.isSomething()的一个实现,它修改了找到该项的集合(如果它返回true).此时,第一段代码将抛出一个ConcurrentModificationException,假设它是一个“常规”集合 – 而第二段代码将返回true.
从根本上说,第二段代码更有效:它只迭代确定答案所需的列表,而不是通过所有内容.很可能是性能不同是无关紧要的 – 特别是如果集合很小 – 但这取决于上下文.
您发现更具可读性的是另一个问题 – 效率可能不会很大,尽管这取决于上下文.就个人而言,我发现第二个版本更具可读性和更高效,所以我总是使用它. (好吧,我会在if语句的主体周围添加大括号,但就是这样.)