陷阱 - 使用 size() 来测试集合是否为空是效率低下的
Java Collections Framework 为所有 Collection
对象提供了两个相关的方法:
size()
返回Collection
中的条目数,和- 如果(且仅当)
Collection
为空,isEmpty()
方法返回 true。
这两种方法都可用于测试集合 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()
是优选的。