陷阱 - 使用 size() 来测试集合是否为空是效率低下的

Java Collections Framework 为所有 Collection 对象提供了两个相关的方法:

这两种方法都可用于测试集合 void。例如:

Collection<String> strings = new ArrayList<>();
boolean isEmpty_wrong = strings.size() == 0; // Avoid this
boolean isEmpty = strings.isEmpty();         // Best

虽然这些方法看起来相同,但某些集合实现不存储大小。对于这样的集合,size() 的实现需要在每次调用时计算大小。例如:

  • 一个简单的链表类(但不是 java.util.LinkedList)可能需要遍历列表来计算元素。
  • ConcurrentHashMap 类需要对所有地图的中的条目求和。
  • 延迟实现集合可能需要在内存中实现整个集合以计算元素。

相比之下,isEmpty() 方法只需要测试集合中是否至少有一个元素。这不需要计算元素。

虽然 size() == 0 的效率并不总是低于 isEmpty(),但正确实施的 isEmpty() 效率低于 size() == 0 是不可想象的。因此,isEmpty() 是优选的。