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

Vik*_*ant 69 java collections is-empty

我有两种方法可以检查List是否为空

if (CollectionUtils.isNotEmpty(listName)) 
Run Code Online (Sandbox Code Playgroud)

if (listName != null && listName.size() != 0)
Run Code Online (Sandbox Code Playgroud)

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

有人可以澄清一下吗?

Jon*_*eet 132

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

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

另外,当然,使用isEmpty()状态更清楚你真正感兴趣的状态.

  • 虽然“List.size()==0”与“List.isEmpty()”性能参数是正确的,但这并不能回答有关使用 Apache 公共集合“CollectionUtils.isEmpty”或“CollectionUtils.isNotEmpty”的问题()` (3认同)

ale*_*y28 55

CollectionUtils.isNotEmpty检查您的集合是否为空且不为空.与双重检查相比,这更好,但前提是您的项目中有此Apache库.如果你不这样做,那么:

if(list != null && !list.isEmpty())
Run Code Online (Sandbox Code Playgroud)

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

aaa*_*aaa 12

除非你已经在使用CollectionUtils,否则我会选择List.isEmpty()更少的依赖项.

性能明智的CollectionUtils会慢一点.因为它基本上遵循相同的逻辑,但有额外的开销.

因此,可读性与性能与依赖性相关.虽然没有太大的区别.

  • List.isEmpty()与CollectionUtils.isEmpty()不同!后者将处理集合为空的情况,前者将抛出NPE. (12认同)

lxk*_*vlk 9

if (CollectionUtils.isNotEmpty(listName))

是相同的:

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

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


Nit*_*ram 7

如果项目中有Apache常用实用程序,请使用第一个实用程序.因为它更短,并且与后者完全相同.两种方法之间没有任何区别,但它在源代码中的外观如何.

还使用空检查

listName.size() != 0
Run Code Online (Sandbox Code Playgroud)

不鼓励因为所有的集合实现都有

listName.isEmpty()
Run Code Online (Sandbox Code Playgroud)

完全相同的功能.

总而言之,如果你的类路径中有Apache common utils,请使用

if (CollectionUtils.isNotEmpty(listName)) 
Run Code Online (Sandbox Code Playgroud)

在任何其他情况下使用

if(listName != null && listName.isEmpty())
Run Code Online (Sandbox Code Playgroud)

您不会注意到任何性能差异.两条线都完全一样.


Sur*_*ala 7

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

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

例子:

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

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