在Java中如何使用size方法获取集合大小_Java集合元素数量解析

冬伟酱_1736

冬伟酱_1736

2026-01-15

627人浏览

原创

size()方法返回集合元素个数,为O(1)时间复杂度,但需防null调用和并发不安全;Map.size()与keySet().size()等价;stream().count()为O(n),不可替代size()。

在java中如何使用size方法获取集合大小_java集合元素数量解析

size() 方法在 Java 集合中的通用行为

size() 是 Collection 接口定义的方法,所有标准集合类(ArrayList、HashSet、LinkedList、HashMap 的 keySet() 等)都实现了它。它的返回值是 int 类型,表示当前集合中元素的个数。

注意:它不递归计算嵌套结构,只统计直接持有的元素数量;对 Map 来说,map.size() 返回的是键值对数量,不是 key 或 value 单独的数量。

  • size() 是 O(1) 时间复杂度 —— 内部通常只是读取一个计数字段,不遍历
  • 空集合(如新创建的 ArrayList)调用 size() 返回 0,不是 null
  • 如果集合被多个线程并发修改且未加同步,size() 返回值可能不准确(如 ArrayList 非线程安全)

常见误用:对 null 集合调用 size() 导致 NullPointerException

这是最常踩的坑:直接对可能为 null 的集合变量调用 size(),运行时报 NullPointerException。

List<string> list = getFromSomewhere(); // 可能返回 null
int count = list.size(); // ❌ 如果 list == null,这里崩</string>

正确做法是显式判空:

  • 用 Objects.nonNull(list) + 三元表达式:int count = Objects.nonNull(list) ? list.size() : 0;
  • 或提前 guard:if (list == null) return 0;
  • 更推荐在方法契约层面避免返回 null —— 改用 Collections.emptyList() 或 Optional

Map 的 size() 和 keySet().size() 是否等价?

等价。对任意 Map 实例 m,m.size() 和 m.keySet().size() 总是相等,因为 Map 的大小定义就是键值对数量,而 keySet() 是其视图,底层共享同一计数逻辑。

JavaScript 测试模式
JavaScript 测试模式

使用 Jest、Vitest 和 Testing Library 实施全面的测试策略,包括单元测试、集成测试和端到端测试,涵盖模拟、测试夹具和测试驱动开发。在编

下载

但要注意性能和语义差异:

  • m.size() 直接返回字段值,开销最小
  • m.keySet().size() 多一次方法调用和对象访问,虽仍是 O(1),但无必要
  • m.values().size() 同样等价,但 values() 视图在某些实现(如 ConcurrentHashMap)中可能触发轻量初始化,不如直接用 size()

Stream.count() 与 Collection.size() 的关键区别

别把 stream().count() 当作 size() 的替代 —— 它们语义和性能完全不同:

  • collection.size():O(1),不触发遍历,不消耗流资源
  • collection.stream().count():O(n),必须完整遍历整个数据源,即使集合本身支持快速获取大小
  • 对已排序或过滤过的流(如 list.stream().filter(...).count()),无法绕过计算,此时 count() 是唯一选择
  • 如果只是想知道原始集合大小,用 size();只有在流式处理链中需要“计数”时,才用 count()

尤其注意:对并行流调用 count() 不会提升性能,反而增加调度开销 —— 计数操作本身无法真正并行化。

集合大小看似简单,但 null 检查、流与集合语义混淆、以及对线程安全边界的忽视,才是实际出问题最多的地方。

Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南

相关专题

更多
c语言中null和NULL的区别
c语言中null和NULL的区别

c语言中null和NULL的区别是:null是C语言中的一个宏定义,通常用来表示一个空指针,可以用于初始化指针变量,或者在条件语句中判断指针是否为空;NULL是C语言中的一个预定义常量,通常用来表示一个空值,用于表示一个空的指针、空的指针数组或者空的结构体指针。

2023.09.22

569

3

java中null的用法
java中null的用法

在Java中,null表示一个引用类型的变量不指向任何对象。可以将null赋值给任何引用类型的变量,包括类、接口、数组、字符串等。想了解更多null的相关内容,可以阅读本专题下面的文章。

2024.03.01

1698

6

counta和count的区别
counta和count的区别

Count函数用于计算指定范围内数字的个数,而CountA函数用于计算指定范围内非空单元格的个数。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2023.11.20

3948

5

string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.02

7579

3

int占多少字节
int占多少字节

int占4个字节,意味着一个int变量可以存储范围在-2,147,483,648到2,147,483,647之间的整数值,在某些情况下也可能是2个字节或8个字节,int是一种常用的数据类型,用于表示整数,需要根据具体情况选择合适的数据类型,以确保程序的正确性和性能。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.08.29

3585

6

c++怎么把double转成int
c++怎么把double转成int

本专题整合了 c++ double相关教程,阅读专题下面的文章了解更多详细内容。

2025.08.29

4748

10

C++中int的含义
C++中int的含义

本专题整合了C++中int相关内容,阅读专题下面的文章了解更多详细内容。

2025.08.29

3165

10

硬盘接口类型介绍
硬盘接口类型介绍

硬盘接口类型有IDE、SATA、SCSI、Fibre Channel、USB、eSATA、mSATA、PCIe等等。详细介绍:1、IDE接口是一种并行接口,主要用于连接硬盘和光驱等设备,它主要有两种类型:ATA和ATAPI,IDE接口已经逐渐被SATA接口;2、SATA接口是一种串行接口,相较于IDE接口,它具有更高的传输速度、更低的功耗和更小的体积;3、SCSI接口等等。

2023.10.19

3248

3

PHP接口编写教程
PHP接口编写教程

本专题整合了PHP接口编写教程,阅读专题下面的文章了解更多详细内容。

2025.10.17

5509

12

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
dev.java 官方:Learn Java
dev.java 官方:Learn Java

共0课时 | 0人学习

Java JDBC数据库连接官方教程
Java JDBC数据库连接官方教程

共0课时 | 0人学习