Java中统计元素个数首选stream().count(),时间复杂度O(1)或O(n);需边处理边计数时用局部变量累加;需索引用传统for循环;避免foreach中修改集合或误用size()判断进度。

Java 中在迭代过程中统计元素个数,最直接的方式不是“边遍历边数”,而是利用已有工具高效完成——多数情况下,你其实不需要手动计数。
用 Stream 的 count() 方法(推荐)
如果你只是想知道集合/数组里有多少元素,且数据源支持 Stream(如 List、Set、数组),用 stream().count() 最简洁、语义清晰,底层也做了优化:
- 对
Collection:会优先调用size(),时间复杂度 O(1) - 对普通流(如从文件或自定义生成器来):才真正遍历计数,O(n)
示例:
List<String> list = Arrays.asList("a", "b", "c");
long count = list.stream().count(); // 结果为 3
遍历时需要同时处理元素 + 累计数量(比如带索引的业务逻辑)
如果必须在循环中做其他事(如过滤、转换、记录位置),可以用一个局部变量累加:
立即学习“Java免费学习笔记(深入)”;
- 用
int count = 0;声明计数器,每次循环体中count++ - 注意:不要在增强 for 循环里修改集合结构(如 remove),否则抛
ConcurrentModificationException
示例(统计非空字符串个数):
int count = 0;
for (String s : list) {
if (s != null && !s.trim().isEmpty()) {
count++;
// 其他处理逻辑...
}
}
System.out.println("有效字符串:" + count);
用 IntStream.range() 或传统 for 循环(适合需索引场景)
当你既要访问元素,又要明确知道当前是第几个(从 0 或 1 开始),传统索引循环更自然:
for (int i = 0; i —— 索引即序号,<code>i + 1就是当前累计个数-
IntStream.range(0, list.size()).forEach(i -> { ... })—— 函数式风格,但注意闭包捕获变量限制
避免常见误区
- 别为了“计数”而强行用迭代器再套一层循环——冗余且易错
- 别在 foreach 中调用
list.size()判断是否“最后一条”——它不反映当前进度,只返回总长度 - 并发环境下统计(如多线程遍历同一集合),需用
AtomicInteger或并行流 +mapToInt等线程安全方式


















