在Java中集合大小如何获取_Java集合size方法解析

size()方法返回集合中实际元素个数,类型为int,时间复杂度通常为O(1),但需判空且优先用isEmpty()判断空集合。

Java集合的size()方法返回什么

size() 方法返回当前集合中元素的个数,类型为 int。它不等于“容量”或“已分配内存大小”,仅表示实际存储的元素数量。对空集合(如刚创建的 ArrayListHashSet),size() 恒为 0;即使底层数组未扩容,只要没添加元素,结果就是 0

size() 在不同集合中的时间复杂度

绝大多数标准集合实现都把 size() 设计为 O(1) 操作——它们内部维护一个计数器,增删元素时同步更新。但有例外:

  • LinkedListO(1)(JDK 8+ 已缓存 size 字段)
  • TreeSet/TreeMapO(1)(JDK 8+ 同样缓存)
  • ConcurrentHashMapO(1)(近似值,因并发修改可能滞后,实际调用 mappingCount() 更准确)
  • Stream.count() 或自定义迭代器包装类:不是 size(),而是 O(n),不能混用

调用 size() 前必须检查是否为 null

集合变量本身可能是 null,直接调用 size() 会抛出 NullPointerException。这不是集合的问题,而是引用未初始化导致的常见错误。

List list = null;
// ❌ 运行时报错
int s = list.size();

// ✅ 正确做法:先判空
if (list != null) {
    int s = list.size();
}
// 或使用 Objects.requireNonNull / Optional 包装

不要用 size() ==

0
判断空集合,优先用 isEmpty()

isEmpty() 语义更清晰,且部分集合(如 LinkedList 在旧 JDK 中)曾用 size() == 0 实现,虽现在基本无性能差异,但可读性和意图表达更重要。

  • list.isEmpty() 直观表达“是否为空”的业务意图
  • list.size() == 0 容易被误读为“需要知道具体数量”,或在后续逻辑中诱导错误地复用 size()
  • 某些不可变集合(如 ImmutableList)可能对 isEmpty() 做额外优化

真正要注意的是:别在循环条件里反复调用 size() 而不缓存,尤其当集合是自定义实现或代理对象时,哪怕理论上是 O(1),也可能因调试代理、监控切面等引入隐式开销。