CollectionUtils.isEmpty()和collection.isEmpty()哪个对性能更好?

10
如果您已经知道集合不为空,对于性能来说什么更好?是使用!collection.isEmpty()还是使用Apache Commons库中的CollectionUtils.isNotEmpty(collection)
还是两者性能没有区别?

CollectionUtils 来自哪里? - Konstantin Yovkov
1
!collection.isEmpty(),虽然我怀疑这不会产生明显的差异。 - Marvin
3
我相信,当你达到这个问题成为你的主要性能问题时,你不需要询问这个问题。 - biziclop
1
在问哪种方法性能更好之前,您是否确定程序中特定地方存在瓶颈? - RealSkeptic
@RealSkeptic 不,我只是想知道是否有任何区别。 - Danny Gloudemans
如果你不知道自己有性能问题,因为你没有进行测量,那么即使你是性能调优方面的专家,你也很可能只是在猜测。你知道这是个问题吗?如果不知道,我建议你按照自己认为最简单和最清晰的方式去做。 - Peter Lawrey
5个回答

11

假设我们讨论的是Apache Commons的话,CollectionUtils.isNotEmpty的代码...

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

public static boolean isNotEmpty(Collection coll)
{
    return (!(isEmpty(coll)));
}

所以,并没有什么区别,那一个空值检查不会成为你的瓶颈 ;-)


3
该方法的重点不在于速度快,而是跳过显式的空值检查。 - Dunes
似乎是这样。您可以将任何集合放在其中,包括 null,而无需担心空指针异常。 - Florian Schaetz

5
其他答案是正确的,但只是为了确认一下:
你为什么要关心这个方法?你的应用程序有性能问题吗?经过仔细的分析,指向了那个方法,所以你正在寻找替代方法?
因为...如果不是这样的话...那么可能我们正在看 过早优化
还有另一个方面:如果“Java标准库”提供了一个功能,我总是会选择它们而不是来自“外部库”的东西。当然,ApacheCommons现在相当普遍了;但我只会在所有其他代码已经使用它时才添加对它的依赖。

1
我认为标准库参数总的来说是个不错的选择。这并不仅仅是因为引入另一个依赖(毕竟,你可能会在项目的其他部分使用该库),更多的是关于“当别人阅读代码时,他们需要首先熟悉这个库”。你的代码对读者所需的预备知识越少,就越好。 - biziclop

1

差异可以忽略不计(额外的空值检查),所有调用甚至可以被C1编译器轻松内联。一般来说,您不应该担心这些简单方法的性能。即使其中一个方法慢了两倍,它仍然比您应用程序中的其余代码快得多。


0

Collection.isEmpty作为apache libs中定义的CollectionUtils,间接地将使用collection.isEmpty()方法。

虽然它们两者之间没有明显的区别,只是

CollectionUtils.isEmptyNullSafe的,正如你所说你知道集合不是空的,所以两者都是同样好的(几乎)


0
通过以下程序,您可以查看列表中1000个整数的清晰结果。 注意:时间以毫秒为单位
collection.isEmpty 几乎为0毫秒
CollectionsUtils.isNotEmpty 需要78毫秒
public static void main(String[] args){
            List<Integer> list = new ArrayList<Integer>();
            for(int i = 0; i<1000; i++)
                list.add(i);

            long startTime = System.currentTimeMillis();
                list.isEmpty();
            long endTime   = System.currentTimeMillis();
            long totalTime = endTime - startTime;
            System.out.println(totalTime);


            long startTime2 = System.currentTimeMillis();
            CollectionUtils.isNotEmpty(list);
            long endTime2   = System.currentTimeMillis();
            long totalTime2 = endTime2 - startTime2;
            System.out.println(totalTime2);
        }

2
它可能捕捉到了一些与方法本身无关的JIT或内存分配。 - Richard Day

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接