CollectionUtils.isNotEmpty()比null检查更好吗?

时间:2015-06-05 12:24:39

标签: java collections java-7 java-collections-api

在以下用例中使用CollectionUtils.isNotEmpty(coll)而不是coll != null的建议很多。

if (CollectionUtils.isNotEmpty(coll)) {
    for (String str : coll) {
    }
}

而不是

if (coll != null) {
    for (String str : coll) {
    }
}

在这里使用CollectionUtils.isNotEmpty(coll)代替其他有什么理由/优势吗?感谢。

4 个答案:

答案 0 :(得分:4)

这里没有真正的优势。即使有,也会非常小。它只是阻止创建Iterator并执行分支指令,这就是它的全部内容。

仅当集合为空时才会出现这种小优势。以下循环:

for (String str : coll) {
   ...
}

相当于:

for (Iterator<String> iterator = col.iterator(); iterator.hasNext();) {
   String str = iterator.next();
   ...
}

当集合为空时,CollectionUtils.isNotEmpty(coll)上的检查会阻止循环执行。因此,在内存中不会创建Iterator,也不会调用hasNext()。对O(1) coll.isEmpty()的{​​{1}}来说,这需要付费。

答案 1 :(得分:2)

反编译显示

public static boolean isEmpty(Collection coll) {
    return coll == null || coll.isEmpty();
}

答案 2 :(得分:1)

问题是,当集合不为空时,集合仍然可以为空。因此,在您的情况下,这取决于您的选择。

答案 3 :(得分:0)

如上所述,这取决于您要测试的内容以及逻辑的构造方式。

假设您的示例

if (CollectionUtils.isNotEmpty(coll)) {
  for (String str : coll) {
     System.out.println("Branch 1. Collection is not empty.");
  }
}
else {
  System.out.println("Branch 2. Collection is empty.");
}

在此示例中,我们可以看到总是 Branch1或Branch2被执行。

如果我们使用null表达式,那么如果coll不是null但为空,结果将有所不同

if (coll != null) {
  for (String str : coll) {
     System.out.println("Branch1. Collection is not empty.");
  }
}
else {
  System.out.println("Branch2. Collection is empty.");
}

如果集合coll不为空但为空,则也没有执行Branch1或Branch2,因为条件coll != null为真,但是在循环for中甚至没有一个通过。

当然,if表达式coll != null && coll.isNotEmpty()CollectionUtils.isNotEmpty(coll)的工作相同。

因此,仅在集合coll != null的情况下,建议不要对null使用test。这是极端条件处理不当的情况,可能是产生不良结果的原因。