我们经常会检查条件,比如列表是否为空。
首先,一个null的集合和一个空的集合是不同的事情。如果你需要测试一个集合是否为null,则需要使用不同的测试来测试集合是否为空。
其次,如果一个集合既可以是null也可以是空(并且它们在应用程序设计中“意味着”相同的东西),那么你的设计存在问题。你最有可能表示……你试图表示的内容……一种方式,而不是两种方式都有/没有。
第三,通常最好使用空集合而不是null,因为你可以统一处理空和非空集合。相比之下,null始终需要作为特殊情况处理。(如果你忘记处理null情况,那么就有可能出现NullPointerExceptions。)
话虽如此……
哪个条件最好?还是需要考虑这些条件的组合以及程序执行的性能?
如果你真的需要处理null的情况,那么你只能测试null。
对于isEmpty()和size()==0的比较:
这两个谓词应该给出相同的答案(除非你有无限的惰性集合...),但在某些情况下,isEmpty()在理论上可能更快。
后者取决于集合类型的实现:具体来说,取决于size()方法是否需要计算集合元素。(我认为标准集合类中没有任何一个类具有这个属性,但这并不意味着你找不到一些具有这个属性的类...)
因此,最优谓词很可能是:
c != null && !c.isEmpty()
或者
!c.isEmpty()
根据你是否需要考虑 null 值来做出决策。显然的推论是,如果你不使用 null 表示空集合,那么你的应用程序很可能会更加高效...同时更加简单和稳健。 (如果您需要不可变的空集合对象,可以免费从 Collections
类定义的方法/静态方法中获取它们。)