collections.frequency()用于统计collection中元素出现次数,需将数组转list后使用,对基本类型数组需装箱,依赖equals()判断相等,高频统计推荐hashmap预处理。

Collections.frequency() 是 Java 中用于统计集合中某个元素出现次数的便捷方法,但它不能直接用于普通数组,只能作用于 Collection 类型(如 ArrayList、LinkedList、HashSet 等)。要统计数组中某元素的出现次数,需先将数组转为 List。
1. 对 ArrayList 等集合直接使用
如果数据已经是 ArrayList 或其他 Collection 实现,调用非常简单:
List<string> list = Arrays.asList("a", "b", "a", "c", "a");
int count = Collections.frequency(list, "a"); // 返回 3
</string>
✅ 注意:该方法内部遍历整个集合,时间复杂度为 O(n),适合中小规模数据;对重复调用多个不同元素的场景,不如预构建 HashMap 高效。
2. 对普通数组(如 String[]、int[])需先转换
数组不是 Collection,必须转成 List 才能用 frequency():
// 字符串数组
String[] arr = {"apple", "banana", "apple", "cherry"};
int count = Collections.frequency(Arrays.asList(arr), "apple"); // ✅ 正确
// 基本类型数组(如 int[])不能直接用 Arrays.asList() —— 会把整个数组当一个元素!
int[] nums = {1, 2, 3, 2, 2};
// ❌ 错误:Arrays.asList(nums) → 返回 List<int>,只含一个元素
// ✅ 正确做法:用 Integer[] 或 Stream(Java 8+)
Integer[] boxed = Arrays.stream(nums).boxed().toArray(Integer[]::new);
int count2 = Collections.frequency(Arrays.asList(boxed), 2); // 返回 3
</int>
3. 处理 null 和自定义对象的注意事项
Collections.frequency() 依赖元素的 equals() 方法判断相等性:
- 若元素为
null,方法可安全统计(内部用 == 和 equals 结合判断); - 若元素是自定义对象(如
Person),必须正确重写equals()(和hashCode(),虽然 frequency 不用它); - 未重写
equals()时,默认比较引用,可能导致统计结果为 0,即使字段值相同。
4. 替代方案:更高效或更灵活的选择
当需要频繁查询多个元素频次,或处理大数据量时,建议预计算频次表:
// 使用 HashMap 统计全部频次(一次遍历,后续 O(1) 查询)
Map<string integer> freqMap = new HashMap();
for (String s : list) {
freqMap.put(s, freqMap.getOrDefault(s, 0) + 1);
}
int count = freqMap.getOrDefault("a", 0);
// Java 8+ 流式写法(简洁但每次调用都遍历)
long countViaStream = list.stream().filter("a"::equals).count();
</string>
⚠️ 提示:Collections.frequency() 简洁易读,适合单次、少量查询;高频或批量统计优先考虑 Map 预处理。










