Collections.frequency用于统计集合中指定元素的出现次数,基于equals方法比较,适用于快速、简洁地统计单个元素频次,尤其在代码可读性和维护性上优势明显。

Collections.frequency
Collection
说起
Collections.frequency
for
if
count++
Collections
frequency
它的用法其实很简单:
int count = Collections.frequency(collection, object);
Collection
ArrayList
LinkedList
HashSet
HashSet
object
举个例子吧,假设你有一个字符串列表,想知道“apple”出现了几次:
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class FrequencyExample {
public static void main(String[] args) {
List<String> fruits = new ArrayList<>();
fruits.add("apple");
fruits.add("banana");
fruits.add("apple");
fruits.add("orange");
fruits.add("apple");
int appleCount = Collections.frequency(fruits, "apple");
System.out.println("Apple appears: " + appleCount + " times."); // 输出 3
}
}是不是比手写循环要清爽很多?这个方法内部其实也是遍历,但它把这些细节封装起来了,让我们的代码更专注于业务逻辑,而不是重复性的计数实现。而且,它在比较元素时用的是
equals()
equals()
我们常常会纠结,到底是直接用
Collections.frequency
for
从性能上看,
Collections.frequency
List
for
Collections.frequency
在这种需要统计所有元素频率的场景下,一个更高效的做法是使用
HashMap
Stream
Collectors.groupingBy
Collectors.counting
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.function.Function;
import java.util.stream.Collectors;
public class StreamFrequencyExample {
public static void main(String[] args) {
List<String> fruits = Arrays.asList("apple", "banana", "apple", "orange", "apple");
Map<String, Long> frequencyMap = fruits.stream()
.collect(Collectors.groupingBy(Function.identity(), Collectors.counting()));
System.out.println(frequencyMap); // {banana=1, orange=1, apple=3}
}
}这个方法的复杂度是O(n),因为它只遍历了一次集合。
所以,我的个人观点是:
Collections.frequency
HashMap
Stream
HashSet
contains
在使用
Collections.frequency
null
首先是
null
Collections.frequency
null
null
ArrayList
object
null
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class NullFrequencyExample {
public static void main(String[] args) {
List<String> items = new ArrayList<>();
items.add("item1");
items.add(null);
items.add("item2");
items.add(null);
int nullCount = Collections.frequency(items, null);
System.out.println("Null appears: " + nullCount + " times."); // 输出 2
}
}这在某些数据清洗或校验的场景下,可能会派上用场,比如你想知道有多少条记录是缺失了某个字段的。
然后是自定义对象。前面提到过,
Collections.frequency
equals()
Person
class Person {
String name;
int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
// 省略getter/setter,为了简洁,这里不写,但实际项目中应该有
// 注意:这里没有重写equals()和hashCode()
}如果你不重写
equals()
hashCode()
equals()
Person
name
age
Collections.frequency
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class CustomObjectFrequencyExample {
public static void main(String[] args) {
List<Person> people = new ArrayList<>();
people.add(new Person("Alice", 30));
people.add(new Person("Bob", 25));
people.add(new Person("Alice", 30)); // 逻辑上和第一个Alice相同,但内存地址不同
int aliceCount = Collections.frequency(people, new Person("Alice", 30));
// 这里输出 0 是大概率事件,因为 new Person("Alice", 30) 又创建了一个新的对象实例,
// 它的内存地址肯定和集合里的实例不同。
System.out.println("Alice appears (without equals/hashCode): " + aliceCount + " times.");
}
}这里输出
0
new Person("Alice", 30)为了让
Collections.frequency
equals()
hashCode()
HashMap
HashSet
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Objects; // 导入Objects工具类,方便生成equals和hashCode
class PersonWithEqualsHashCode {
String name;
int age;
public PersonWithEqualsHashCode(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
PersonWithEqualsHashCode person = (PersonWithEqualsHashCode) o;
return age == person.age && Objects.equals(name, person.name);
}
@Override
public int hashCode() {
return Objects.hash(name, age);
}
// 省略getter/setter
}
public class CustomObjectFrequencyWithEqualsHashCodeExample {
public static void main(String[] args) {
List<PersonWithEqualsHashCode> people = new ArrayList<>();
people.add(new PersonWithEqualsHashCode("Alice", 30));
people.add(new PersonWithEqualsHashCode("Bob", 25));
people.add(new PersonWithEqualsHashCode("Alice", 30)); // 逻辑上和第一个Alice相同
int aliceCount = Collections.frequency(people, new PersonWithEqualsHashCode("Alice", 30));
System.out.println("Alice appears (with equals/hashCode): " + aliceCount + " times."); // 输出 2
}
}现在,
Collections.frequency
frequency
虽然
Collections.frequency
1. 快速判断元素是否出现特定次数: 有时候我们不只是想知道出现多少次,而是想知道它是否“恰好”出现了X次,或者“至少”出现了X次。比如,在一个投票系统中,你想知道某个选项是否获得了至少10票:
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
public class VoteCountExample {
public static void main(String[] args) {
List<String> votes = Arrays.asList("optionA", "optionB", "optionA", "optionC", "optionA",
"optionA", "optionB", "optionA", "optionC", "optionA",
"optionA", "optionB", "optionA"); // optionA 出现了 9 次
int requiredVotes = 10;
if (Collections.frequency(votes, "optionA") >= requiredVotes) {
System.out.println("Option A has enough votes to pass.");
} else {
System.out.println("Option A needs more votes. Currently: " + Collections.frequency(votes, "optionA"));
}
}
}这种场景下,
frequency
2. 集合的简单差异分析(非精确): 这可能有点“歪用”,但偶尔我会用它来做一些非常粗略的集合内容对比。比如,你有两个列表
listA
listB
listA
X
listB
X
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
public class ListDifferenceExample {
public static void main(String[] args) {
List<String> listA = Arrays.asList("apple", "banana", "apple");
List<String> listB = Arrays.asList("apple", "orange", "apple");
String target = "apple";
if (Collections.frequency(listA, target) != Collections.frequency(listB, target)) {以上就是Collections.frequency方法的应用的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号