检查Java中的集合是否为空:哪种方法最好?


77

我有两种检查列表是否为空的方法

if (CollectionUtils.isNotEmpty(listName)) 

if (listName != null && listName.size() != 0)

我的拱门告诉我,前者比后者更好。但是我认为后者更好。

任何人都可以澄清一下吗?


2
您为什么认为“后期”更好?
2012年

3
为什么不listname.isEmpty()呢?isEmpty是Collection界面中的一种方法
ccheneson 2012年

1
集合接口提供了isEmpty()方法用于空检查。两种方法都更好,您可以根据选择使用任何一种方法。
2012年

1
我认为个人风格可以解决这个问题。CollectionUtils在一个调用中完成了两件事,因此您作为开发人员更容易。后者为您作为开发人员提供了更多的工作,但是您确实将堆栈引用保存到计算机上,从而节省了计算机,整个堆栈都围绕着它工作。在性能方面,后者会稍快一些。并非您会注意到。
劳伦斯2015年

1
嗨,那里...我是唯一将其视为可读性的人吗?第一个显然可以使代码更易读。哪一句话让您在阅读时少了一些思考,将两个运算的分辨率与and或简单地阅读isNotEmpty相结合?我们可以长期讨论后者的性能优势,但是由于容易出错,前者更加健壮。
coya

Answers:


139

您应该绝对使用isEmpty()。计算size()任意列表的可能会很昂贵。即使确认是否有任何元素可以是昂贵的,当然,但没有优化size()不能isEmpty()速度更快,而相反的情况并非如此。

例如,假设你有一个链表结构,它并没有缓存的大小(而LinkedList<E> )。然后size()将变为O(N)运算,而isEmpty()仍为O(1)

当然,另外,使用isEmpty()状态可以更清楚地说明您实际感兴趣的内容。


尽管List.size()==0vsList.isEmpty()性能参数是正确的,但这不能回答有关使用Apache commons-collection的问题,CollectionUtils.isEmpty或者CollectionUtils.isNotEmpty()
Julien Kronegg

不过,LinkedLists实现isEmptyreturn size() == 0;
user3932000 '18

@ user3932000:当然,我非常期望这是对任何实施的情况下确实知道一种廉价的方式尺寸
乔恩斯基特

60

CollectionUtils.isNotEmpty检查您的集合是否不为null也不为空。与仔细检查相比,这样做更好,但前提是您的项目中有此Apache库。如果您不这样做,请使用:

if(list != null && !list.isEmpty())

4
使用Apache commons-collections CollectionUtils.isEmpty(或CollectionUtils.isNotEmpty)的另一个优点是您的if条件分支较少,因此在测试中更容易达到良好的分支覆盖率。例如,Sonarqube最多报告75%的覆盖率,if (list==null || list.isEmpty())因为您不能同时有一个为空且不为空的列表。
朱利安·克朗格

12

除非您已经在使用CollectionUtils,否则我会寻求List.isEmpty()更少的依赖。

在性能方面,CollectionUtils会慢一些。因为它基本上遵循相同的逻辑,但是具有额外的开销。

因此,这将是可读性,性能和依赖关系。虽然没有太大的区别。


作为开发人员20年和使用CollectionUtils的习惯使我变得懒惰。甚至没有注意到标准的List.isEmpty()!永远不会老得学。谢啦!我将更改我的这个着装:-D
劳伦斯(Lawrence)

12
List.isEmpty()与CollectionUtils.isEmpty()不同!后者将处理集合为null的情况,前者将抛出NPE。
Starkii 2015年

11

if (CollectionUtils.isNotEmpty(listName))

是相同的:

if(listName != null && !listName.isEmpty())

第一种方法listName可以为null,并且不会抛出null指针异常。在第二种方法中,您必须手动检查null。第一种方法更好,因为它需要的工作量更少。使用.size() != 0根本没有必要,我也知道它比使用慢.isEmpty()


7

如果您的项目中具有Apache通用实用程序,请使用第一个。因为它更短,并且与后者完全相同。两种方法之间没有什么区别,但是它们在源代码内部的外观如何。

还用空支票

listName.size() != 0

不建议使用此方法,因为所有collection实现都具有

listName.isEmpty()

功能完全相同。

因此总而言之,如果您的类路径中仍然有Apache通用utils,请使用

if (CollectionUtils.isNotEmpty(listName)) 

在任何其他情况下使用

if(listName != null && listName.isEmpty())

您不会注意到任何性能差异。这两行的功能完全相同。


1
有些集合的size()方法为O(n)。通常期望所有isEmpty()实现都是O(1)。
Mike Duigou 2014年

3

Apache Commons的CollectionUtils.isNotEmpty(Collection)是NULL-SAFE检查

如果集合/列表为非空且不为空,则返回TRUE;如果集合为Null,则返回FALSE

例:

List<String> properties = new ArrayList();
...
if (CollectionUtils.isNotEmpty(properties)) {
  // process the list
} else {
 // list is null or empty
}

请参阅:https : //commons.apache.org/proper/commons-collections/apidocs/org/apache/commons/collections4/CollectionUtils.html#isNotEmpty(java.util.Collection)


1

JDK中的ConcurrentSkipListSet实现是一个很好的例子,它说明了:

注意,与大多数集合不同,size方法不是恒定时间操作。

这是一个明显的情况,isEmpty()比检查是否有效size()==0

您可以直观地了解为什么某些集合可能是这种情况。如果是那种必须遍历整个事物以计算元素的结构,那么如果您只想知道它是否为空,则可以在找到第一个元素后立即停止。


1

使用CollectionUtils.isEmpty(Collection coll)

空安全检查指定的集合是否为空。Null返回true。

参数: coll-要检查的集合,可以为null

返回: 如果为空或为null,则返回true



0

我会用第一个。很明显,马上就知道它在做什么。我认为在这里不需要空检查。


-6

要检查集合是否为空,可以使用方法:.count()。例:

DBCollection collection = mMongoOperation.getCollection("sequence");
    if(collection.count() == 0) {
        SequenceId sequenceId = new SequenceId("id", 0);
        mMongoOperation.save(sequenceId);
    }
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.