Collections.frequency 是 Java 中用于单次统计元素频次的轻量线程安全方法,时间复杂度 O(n),适用于小到中等规模数据、临时校验或调试场景,依赖 equals() 比较,支持 null,但海量数据频繁查询时应改用 Map 预聚合。

Collections.frequency 是 Java 集合工具类中一个轻量、易用且线程安全的静态方法,适合在不引入额外依赖、不改变原集合的前提下,快速统计某元素在 List 或 Collection 中的出现次数。它底层采用遍历比较,时间复杂度为 O(n),虽不如预建哈希表(如 Map)做多次查询高效,但在**单次统计、临时校验、调试分析或小到中等规模数据场景下非常实用**。
适用前提:确保元素可正确比较
该方法依赖 equals() 判断相等性,因此:
- 对于
String、Integer等包装类或已重写equals的自定义对象,可直接使用; - 若传入自定义对象(如
User),必须重写equals(和hashCode,虽然此处未用到哈希,但属良好实践); - 注意
null值支持——Collections.frequency(list, null)合法,会统计null元素个数。
典型实战用法:一行代码完成频次获取
无需手写循环,避免空指针或逻辑错漏。例如:
List<String> logs = Arrays.asList("ERROR", "INFO", "ERROR", "WARN", "ERROR");
int errorCount = Collections.frequency(logs, "ERROR"); // 返回 3
再比如统计日志中某用户 ID 出现次数:
List<Long> userIds = fetchAllUserIdsFromDB(); // 假设返回 10 万条 long targetId = 12345L; int count = Collections.frequency(userIds, targetId); // 直接得结果,无需构建 Map
性能提醒:海量数据下需谨慎评估
当集合元素达百万级且需频繁统计不同值时,Collections.frequency 每次都全量遍历,开销显著。此时应改用一次预处理:
- 用
Map<T, Integer>预聚合(如Collectors.groupingBy(..., Collectors.counting())); - 若仅需 Top-K 高频项,可用
TreeMap或PriorityQueue优化; - 对超大数据(如日志文件流式处理),建议结合 Spark 或 Flink 等分布式框架。
替代思路:配合 Stream API 更灵活(Java 8+)
若需链式操作或附加条件(如忽略大小写、按属性匹配),Stream 更直观:
List<String> words = Arrays.asList("apple", "Apple", "banana", "APPLE");
long appleCount = words.stream()
.filter(w -> "apple".equalsIgnoreCase(w))
.count(); // 返回 3
这种方式语义清晰、可组合性强,且支持并行(parallelStream()),对多核 CPU 友好。

















