5

我们使用 ArrayList、hashmap 等集合。

我们检查条件的次数,例如列表是否为空。

我们有很多方法可以检查我们的集合是否为空。

不同的方法。

1. if(list==null)
2. if(list.size()==0)
3. if(list.isEmpty())

另外有时我们还需要检查list是否不为null,所以我们通常通过这些方式进行检查

1. if(list!=null)
2. if(list.size()>0)
3. if(!list.isEmpty()) 

哪个是最好的条件,或者我们是否需要考虑程序执行的性能对这些条件进行某种组合?

4

11 回答 11

9

最好的组合是

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

        //Yeah ,do something
}

一个用于空检查,然后检查是否存在任何内容

于 2013-10-10T11:04:21.813 回答
6
1. if(list!=null)

你应该确保永远不会发生这种情况!

阅读Joshua Bloch 撰写的 Effective Java 2nd Edition
第 43 条:返回空数组或集合,而不是空值

[...] 总之,没有理由从数组或集合值方法返回 null 而不是返回空数组或集合。null-return 习惯用法可能是 C 编程语言的保留,其中数组长度与实际数组分开返回。在 C 中,如果返回零作为长度,则分配数组没有任何优势。

简而言之,让您的方法返回Collections.emptyList()而不是 null,这样您就不用担心一件事了。

2. if(list.size()>0)
3. if(!list.isEmpty()) 

那要看。对于像 ArrayList 这样的简单集合,它们是等价的。但是,如果您的 Collection 实际上是数据库查询的实时视图怎么办?调用 size() 可能是一个非常昂贵的操作,而 isEmpty() 总是 O(1)。我会说使用 isEmpty()。

另请参阅 Jon Skeet 的回答:https ://stackoverflow.com/a/11152624/342852

于 2013-10-10T11:08:55.030 回答
3

Java8 中,您可以使用Optional正确处理 null 情况。例如,两个列表animalsNullanimalWithNullElements都将由函数正确处理filterList

List<String> animalsNull = null;

List<String> animalWithNullElements = new ArrayList<String>();
        animalWithNullElements.add(0, null);
        animalWithNullElements.add(1, "Guybrush Threepwood");
        animalWithNullElements.add(2, null);

private static List<String> filterList(List<String> animals) {
        return Optional.ofNullable(animals)
               .orElseGet(Collections::emptyList)
               .stream()
               .filter(Objects::nonNull)
               .collect(Collectors.toList());
    }
于 2016-08-29T14:54:52.687 回答
2

这真的取决于你想做什么。如果你想确定一个列表存在并且有一些元素,那么你会使用

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

如果我可以提供一些建议,在返回集合时,默认返回一个空集合。这样你就可以避免空值。

于 2013-10-10T11:06:36.527 回答
2

我们检查条件的次数,例如列表是否为空。

首先,null集合和空集合是不同的东西。如果你需要测试一个集合是否是null你需要一个不同的测试,如果你试图测试集合是否为空。

其次,如果一个集合可能是或者是null空的(根据您的应用程序设计,它们“意味着”相同的东西),那么您的设计就有问题。你应该最有可能代表......无论你试图代表什么......一种方式,而不是一种/两种方式。

第三,通常最好使用空集合而不是 a null,因为您可以统一对待空集合和非空集合。相比之下,anull 总是需要作为特殊情况处理。(如果你忘记处理这个null案子,那么你就有可能NullPointerExceptions。)


话说回来 ...

哪个是最好的条件,或者我们是否需要考虑程序执行的性能对这些条件进行某种组合?

如果你真的需要处理 a 的情况null,那么你别无选择,只能测试null.

对于isEmpty()size() == 0

  • 这两个谓词应该给出相同的答案(除非你有一个无限的惰性集合......),但是

  • 在某些情况下isEmpty() 可能会更快,至少在理论上是这样。

后者取决于集合类型的实现:具体来说,取决于size()方法是否需要对集合元素进行计数。(我不认为任何标准集合类都具有此属性,但这并不是说您不会找到具有此属性的类...)

所以最优谓词很可能是:

 c != null && !c.isEmpty()

或者

 !c.isEmpty()

取决于您是否(真的)需要满足空值。

显而易见的推论是,如果您不使用null来表示空集合,您的应用程序可能会更高效......以及更简单和更健壮...... (如果您需要不可变的空集合对象,您可以从类定义的方法/静态中免费获取它们Collections。)

于 2013-10-10T11:21:38.727 回答
1

有一个CollectionUtils从 Apache commons-collectionsbundle 调用的有用的 util 类。使用它,代码将如下所示:

if(CollectionUtils.isEmpty(collection))

它看起来不错,并且在引擎盖下它具有相同的调用:

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

于 2017-04-26T10:25:58.330 回答
0

null装置list用 null 初始化。null列出sizeisEmpty将抛出NullPointerException。但是,not nulllist可以为空或 size==0

(list!=null) != (list.size()==0)

size==0 和 isEmpty 是等价的。

(list.size()==0) ==  list.isEmpty()
于 2013-10-10T11:04:20.163 回答
0

可以有多种方法来处理这个问题:

1:如果代码确保集合不能通过null在构造函数中或作为字段初始化来初始化它,那么调用者不需要理想地检查null任何地方。只有isEmpty检查就足够了:

private List<Integer> numbers = new ArrayList<Integer>(); //or in constructor

// 然后调用者可以安全地使用

if(numbers.isEmpty)

2:或者编写一个实用方法来拥有nullempty检查,不需要size检查,因为它已经在isEmpty调用内部发生。在代码的其他地方使用此实用程序方法。

public static boolean empty(Collection<?> col) {
   return col == null || col.isEmpty();
}
于 2013-10-10T11:05:53.230 回答
0

这取决于您的程序结构。例如,我有一个名为 的辅助类ArrayUtils,其中我有一个如下所示的 API:

public static <E> boolean isEmpty(final Collection<E> collection)
{
    return collection == null || collection.isEmpty();
}

当我知道我可能会得到一份null清单时,我会使用这个,但当我绝对确定它不是null时,我只使用if ( collection.isEmpty ). 也提高了代码的可读性。

collection.size() > 1是多余的,因为您可以使用其他 API。

于 2013-10-10T11:06:16.203 回答
0

您可以使用以下两个谓词来做到这一点:

public static final Predicate<String> NULL_OR_EMPTY = (in) -> null == in || "".equals(in);

public static final Predicate<List<String>> STRING_LIST_NULL_OR_EMPTY = (strList) ->  strList.stream().filter(NULL_OR_EMPTY).collect(Collectors.toList()).size() > 0;
于 2018-08-07T10:20:56.013 回答
0

如果您是代码库的所有者,我将完全避免使用这种逻辑。当您的集合供应商无法返回 null 但引用 Collections.emptyXXX 或只是普通的空容器为空时,请尝试遵循该模型。

于 2016-11-17T15:42:35.887 回答