本文目录导读:

- 榜单&投票(List + 排序)
- 日活用户去重(Set)
- 热点词频统计(HashMap + 遍历)
- 双端队列(Deque)实现回文检查
- 优先级队列(PriorityQueue)实现任务调度
- Stream API 结合集合操作(现代写法)
Java集合框架是日常开发中最常用的工具之一,掌握它的核心用法(如List、Set、Map及其常用实现类)非常重要,下面提供几个典型的Java案例,涵盖增删改查、遍历、排序、去重、线程安全等常见场景。
榜单&投票(List + 排序)
场景:实现一个简单的投票统计,按票数从高到低排序,取前3名。
import java.util.*;
public class VoteRanking {
public static void main(String[] args) {
// 模拟投票数据:候选人 -> 票数
Map<String, Integer> voteMap = new HashMap<>();
voteMap.put("张三", 120);
voteMap.put("李四", 350);
voteMap.put("王五", 98);
voteMap.put("赵六", 210);
voteMap.put("孙七", 450);
// 将Map的Entry放入List,按value(票数)降序排序
List<Map.Entry<String, Integer>> list = new ArrayList<>(voteMap.entrySet());
list.sort((e1, e2) -> e2.getValue().compareTo(e1.getValue()));
// 输出前三名
System.out.println("=== 投票排名 TOP3 ===");
for (int i = 0; i < Math.min(3, list.size()); i++) {
Map.Entry<String, Integer> entry = list.get(i);
System.out.println("第" + (i + 1) + "名:" + entry.getKey() + "(" + entry.getValue() + "票)");
}
}
}
知识点:
HashMap:存储键值对(无序)ArrayList:将Map.Entry转为List,方便排序sort()+ Lambda:自定义排序规则
日活用户去重(Set)
场景:统计当天活跃的用户ID,去除重复登录的用户。
import java.util.*;
public class DailyActiveUsers {
public static void main(String[] args) {
// 模拟某天所有用户的登录记录(可能含重复)
List<String> loginRecords = Arrays.asList(
"user001", "user002", "user003",
"user001", "user004", "user002", "user005"
);
// 使用HashSet自动去重
Set<String> activeUsers = new HashSet<>(loginRecords);
System.out.println("全部登录记录:\n" + loginRecords);
System.out.println("\n去重后的活跃用户(共计" + activeUsers.size() + "人):");
// 使用增强for循环遍历Set
for (String user : activeUsers) {
System.out.println(" - " + user);
}
// 验证是否包含某个用户
System.out.println("\nuser001是否活跃:" + activeUsers.contains("user001"));
}
}
知识点:
HashSet:无序、唯一、适合去重Set.contains():快速查找
热点词频统计(HashMap + 遍历)
场景:统计文章里每个单词出现的次数,并按频率降序输出。
import java.util.*;
public class WordCount {
public static void main(String[] args) {
String text = "apple banana apple orange banana apple grape";
String[] words = text.split(" ");
Map<String, Integer> freqMap = new HashMap<>();
for (String word : words) {
// getOrDefault避免空指针,简洁优雅
freqMap.put(word, freqMap.getOrDefault(word, 0) + 1);
}
// 按词频降序排序输出
List<Map.Entry<String, Integer>> list = new ArrayList<>(freqMap.entrySet());
list.sort((e1, e2) -> e2.getValue().compareTo(e1.getValue()));
System.out.println("=== 词频统计(降序)===");
for (Map.Entry<String, Integer> entry : list) {
System.out.println(entry.getKey() + " : " + entry.getValue());
}
}
}
知识点:
HashMap:计数神器getOrDefault:避免手动判空- Entry排序输出
双端队列(Deque)实现回文检查
场景:判断一个字符串是否是回文(正反读相同),利用双端队列高效实现。
import java.util.*;
public class PalindromeCheck {
public static boolean isPalindrome(String s) {
// 转小写并去除非字母数字字符
String cleaned = s.toLowerCase().replaceAll("[^a-z0-9]", "");
// 双端队列: ArrayDeque
Deque<Character> deque = new ArrayDeque<>();
for (char c : cleaned.toCharArray()) {
deque.addLast(c);
}
// 两端同时取出比较
while (deque.size() > 1) {
if (!deque.removeFirst().equals(deque.removeLast())) {
return false;
}
}
return true;
}
public static void main(String[] args) {
String test1 = "A man, a plan, a canal: Panama";
String test2 = "race a car";
System.out.println("\"" + test1 + "\" 是否为回文? " + isPalindrome(test1));
System.out.println("\"" + test2 + "\" 是否为回文? " + isPalindrome(test2));
}
}
知识点:
Deque(双端队列)vsLinkedList:ArrayDeque性能更好,适合栈/队列场景removeFirst()/removeLast():从两端操作
优先级队列(PriorityQueue)实现任务调度
场景:模拟一个简单的任务调度系统,按紧急程度(优先级)取出任务执行。
import java.util.*;
class Task {
String name;
int priority; // 数字越小越紧急
Task(String name, int priority) {
this.name = name;
this.priority = priority;
}
@Override
public String toString() {
return name + "(优先级" + priority + ")";
}
}
public class TaskScheduler {
public static void main(String[] args) {
// 小顶堆:优先级数字越小越靠前
PriorityQueue<Task> queue = new PriorityQueue<>(
(t1, t2) -> Integer.compare(t1.priority, t2.priority)
);
// 插入任务
queue.offer(new Task("系统更新", 5));
queue.offer(new Task("安全补丁", 1));
queue.offer(new Task("用户反馈处理", 3));
queue.offer(new Task("日志清理", 10));
System.out.println("=== 任务执行顺序(按优先级)===");
while (!queue.isEmpty()) {
System.out.println("执行中:" + queue.poll());
}
}
}
知识点:
PriorityQueue:天然堆结构,适合优先级队列- 自定义比较器决定“紧急”顺序
Stream API 结合集合操作(现代写法)
场景:筛选出所有分数高于90的学生,并按分数降序取前3名。
import java.util.*;
import java.util.stream.Collectors;
class Student {
String name;
int score;
Student(String name, int score) {
this.name = name;
this.score = score;
}
public String toString() {
return name + ":" + score;
}
}
public class StreamExample {
public static void main(String[] args) {
List<Student> students = Arrays.asList(
new Student("小明", 92),
new Student("小红", 88),
new Student("小刚", 95),
new Student("小美", 78),
new Student("小强", 91)
);
// 链式操作:筛选 -> 排序 -> 取前3 -> 收集成List
List<Student> top3 = students.stream()
.filter(s -> s.score > 90)
.sorted((a, b) -> b.score - a.score) // 降序
.limit(3)
.collect(Collectors.toList());
System.out.println("分数 > 90 的前三名:");
top3.forEach(System.out::println);
// 也可以直接输出姓名列表
List<String> names = top3.stream()
.map(s -> s.name)
.collect(Collectors.toList());
System.out.println("姓名列表:" + names);
}
}
知识点:
- Stream API:filter、sorted、limit、collect
- map 提取属性、forEach 遍历
- 函数式编程风格简化集合处理
| 案例 | 核心集合 | 主要用途 |
|---|---|---|
| 投票排名 | List + Map | 排序、Entry操作 |
| 日活去重 | Set | 唯一性、去重 |
| 词频统计 | HashMap | 计数、排序输出 |
| 回文检查 | Deque | 双端队列、对称判断 |
| 任务调度 | PriorityQueue | 优先级、堆排序 |
| Stream筛选 | List + Stream | 现代链式操作、筛选聚合 |
这些案例涵盖了日常开发中最常用的集合操作,建议在实际编码时多动手敲一遍,对理解集合框架的“增删改查+排序+去重+遍历”会很有帮助。