Why is list.size()>0 slower than list.isEmpty() in Java?

For ArrayList, yes — you are correct that the operations take (roughly) the same time.

For other implementations of List — for example, a naïve linked list* — counting the size might take a very long time, while you only actually care whether it is greater than zero.

So if you absolutely know that the list is an implementation of ArrayList and will never ever change, then it does not really matter; but:

  1. This is bad programming practice to tie yourself down to a specific implementation.
  2. If things change a few years down the line with code restructuring, testing will show that "it works," but things are running less efficiently than before.
  3. Even in the best case, size() == 0 is still not faster than isEmpty(), so there is no compelling reason to ever use the former.
  4. isEmpty() is a clearer definition of what it is you actually care about and are testing, and so makes your code a bit more easily understandable.

* I originally wrote LinkedList here, implicitly referencing java.util.LinkedList, though that particular implementation does store its size explicitly, making size() an O(1) operation here. A naïve linked list operation might not do this, and in the more general sense there is no efficiency guarantee on implementations of List.


Your testing code is flawed.

Just reverse the order, i.e call isEmpty first and size > 0 second and you'll get the opposite result. This is due to class loading, caching, etc.


I'm sorry, but your benchmark is flawed. Take a look at Java theory and practice: Anatomy of a flawed microbenchmark for a general description on how to approach benchmarks.


Update: for a proper benchmark you should look into JApex.


.size() has to look at the entire list, while .isEmpty() can stop at the first one.

Obviously implementation dependent, but as has been said before, if you don't need to know the actual size, why bother counting all the elements?