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

Java集合的size()方法返回什么
size() 方法返回当前集合中元素的个数,类型为 int。它不等于“容量”或“已分配内存大小”,仅表示实际存储的元素数量。对空集合(如刚创建的 ArrayList 或 HashSet),size() 恒为 0;即使底层数组未扩容,只要没添加元素,结果就是 0。
size() 在不同集合中的时间复杂度
绝大多数标准集合实现都把 size() 设计为 O(1) 操作——它们内部维护一个计数器,增删元素时同步更新。但有例外:
-
LinkedList:O(1)(JDK 8+ 已缓存size字段) -
TreeSet/TreeMap:O(1)(JDK 8+ 同样缓存) -
ConcurrentHashMap:O(1)(近似值,因并发修改可能滞后,实际调用mappingCount()更准确) -
Stream.count()或自定义迭代器包装类:不是size(),而是O(n),不能混用
调用 size() 前必须检查是否为 null
集合变量本身可能是 null,直接调用 size() 会抛出 NullPointerException。这不是集合的问题,而是引用未初始化导致的常见错误。
Listlist = null; // ❌ 运行时报错 int s = list.size(); // ✅ 正确做法:先判空 if (list != null) { int s = list.size(); } // 或使用 Objects.requireNonNull / Optional 包装
不要用 size() == 0 判断空集合,优先用 isEmpty()
isEmpty() 语义更清晰,且部分集合(如 LinkedList 在旧 JDK 中)曾用 size() == 0 实现,虽现在基本无性能差异,但可读性和意图表达更重要。
立即学习“Java免费学习笔记(深入)”;
-
list.isEmpty()直观表达“是否为空”的业务意图 -
list.size() == 0容易被误读为“需要知道具体数量”,或在后续逻辑中诱导错误地复用size()值 - 某些不可变集合(如
ImmutableList)可能对isEmpty()做额外优化
真正要注意的是:别在循环条件里反复调用 size() 而不缓存,尤其当集合是自定义实现或代理对象时,哪怕理论上是 O(1),也可能因调试代理、监控切面等引入隐式开销。










