检查集合的最佳方法不是null&零条件

时间:2013-10-10 11:02:06

标签: java collections

我们使用像ArrayList,hashmap和amp;这样的集合。更多。

我们检查条件的次数,例如list是否为null。

我们有很多方法来判断我们的集合是否为空。

不同的方式。

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

有时我们还需要检查列表是否为空,因此我们通常会通过这些方式检查它

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

哪种条件最好还是我们需要做一些组合   考虑到程序执行的性能?

11 个答案:

答案 0 :(得分:8)

最好的组合是

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

        //Yeah ,do something
}

一个用于空检查,然后是否有任何检查

答案 1 :(得分:6)

1. if(list!=null)

你应该确保从未如此!!

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

  

[...]总之,没有理由从数组中返回null或   集合值方法而不是返回一个空数组或   采集。归零成语很可能是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

答案 2 :(得分:3)

Java8中,您可以使用Optional正确处理空案例。例如,animalsNull函数可以正确处理animalWithNullElementsfilterList这两个列表:

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());
    }

答案 3 :(得分:2)

这实际上取决于你想做什么。如果你想确定列表存在并且有一些元素,那么你将使用

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

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

答案 4 :(得分:2)

  

我们检查条件的次数,例如list是否为null。

首先,null集合和空集合不同的东西。如果您需要测试集合是否为null,则需要进行不同的测试,如果您尝试测试集合是否为空。

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

第三,通常最好使用空集合而不是null,因为您可以统一处理空集合和非空集合。相比之下,null 始终需要作为特例处理。 (如果您忘记处理null案件,那么您有NullPointerExceptions的潜力。)


说完了......

  

考虑到程序执行的性能,哪个是最佳条件还是需要将这些组合起来?

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

isEmpty()size() == 0

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

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

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

所以最佳谓词最有可能是:

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

 !c.isEmpty()

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

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

答案 5 :(得分:1)

Apache CollectionUtils包中有一个名为commons-collections的有用的util类。使用它时,代码将如下所示:

if(CollectionUtils.isEmpty(collection))

它看起来不错,并且它具有相同的调用:

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

答案 6 :(得分:0)

null表示list初始化为null。 null列表sizeisEmpty会抛出NullPointerException。但是,not list不能为空或大小== 0

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

size == 0和isEmpty是等价的。

(list.size()==0) ==  list.isEmpty()

答案 7 :(得分: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();
}

答案 8 :(得分: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。

答案 9 :(得分:0)

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

答案 10 :(得分: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;