Collections.frequency()用于统计元素在List中出现次数,适用于ArrayList等List接口实现类,不支持原始数组;需先用Arrays.asList()转换数组,自定义对象须重写equals();高频多轮统计应改用Map预聚合。

Collections.frequency() 是 Java 集合工具类中一个简洁高效的方法,专用于统计某个元素在 List 中出现的次数。它不适用于数组(如 int[] 或 String[]),但可直接作用于 ArrayList、LinkedList 等实现了 List 接口的集合。
确保数据是 List 类型,不是原始数组
如果业务标识存放在普通数组中(比如 String[] ids = {"A001", "A002", "A001"};),需先转为 List:
- 用
Arrays.asList(ids)转换(注意:返回的是固定大小列表,不可增删) - 若后续可能修改,建议包装成
new ArrayList(Arrays.asList(ids))
调用 frequency() 统计指定标识频次
语法简单直观:
Collections.frequency(list, target)例如统计订单号 "ORD-2024-001" 在订单列表中出现几次:
List<string> orderIds = Arrays.asList("ORD-2024-001", "ORD-2024-002", "ORD-2024-001");</string>int count = Collections.frequency(orderIds, "ORD-2024-001"); // 返回 2
该方法内部遍历列表,使用 equals() 判断相等,因此要求业务标识对象正确重写了 equals()(和 hashCode(),虽此处未用到)。
处理自定义对象时要注意 equals 实现
若业务标识是自定义类(如 BusinessTag),不能直接靠默认引用比较:
- 必须重写
equals()方法,依据关键字段(如tagCode)判断逻辑相等 - 避免仅靠
==或未重写的equals()导致统计结果为 0 - 示例:两个
new BusinessTag("Urgent")实例,只有equals返回true才会被识别为同一标识
替代方案对比:什么情况下不该用 frequency()
当需要高频、多轮统计或数据量极大时,frequency() 每次都线性扫描,效率不如预构建的 Map:
- 单次查询 → 用
Collections.frequency()最简明 - 多次查不同标识 → 先用
Stream.groupingBy()或HashMap预聚合更高效 - 需同时获取 Top N 高频项 → 直接流式分组并排序更合适

















