本文目录导读:

Java HashMap 使用案例
HashMap 是 Java 中最常用的集合类之一,下面通过几个实际案例来演示如何使用。
基础使用案例
import java.util.HashMap;
import java.util.Map;
public class BasicHashMapExample {
public static void main(String[] args) {
// 1. 创建HashMap
HashMap<String, Integer> scores = new HashMap<>();
// 2. 添加元素
scores.put("张三", 95);
scores.put("李四", 88);
scores.put("王五", 92);
scores.put("赵六", 78);
// 3. 获取元素
System.out.println("张三的成绩: " + scores.get("张三"));
// 4. 判断是否包含key
boolean hasLiSi = scores.containsKey("李四");
System.out.println("是否包含李四: " + hasLiSi);
// 5. 判断是否包含value
boolean hasScore95 = scores.containsValue(95);
System.out.println("是否有95分: " + hasScore95);
// 6. 获取大小
System.out.println("学生人数: " + scores.size());
// 7. 删除元素
scores.remove("赵六");
System.out.println("删除赵六后人数: " + scores.size());
// 8. 清空HashMap
// scores.clear();
}
}
遍历HashMap的多种方式
import java.util.HashMap;
import java.util.Map;
public class HashMapIterationExample {
public static void main(String[] args) {
HashMap<String, String> cities = new HashMap<>();
cities.put("北京", "首都");
cities.put("上海", "魔都");
cities.put("广州", "羊城");
cities.put("深圳", "鹏城");
// 方式1: 使用 entrySet 遍历
System.out.println("=== 方式1: entrySet ===");
for (Map.Entry<String, String> entry : cities.entrySet()) {
System.out.println(entry.getKey() + " -> " + entry.getValue());
}
// 方式2: 使用 keySet 遍历
System.out.println("\n=== 方式2: keySet ===");
for (String key : cities.keySet()) {
System.out.println(key + " -> " + cities.get(key));
}
// 方式3: 使用 values 遍历
System.out.println("\n=== 方式3: values ===");
for (String value : cities.values()) {
System.out.println("城市别称: " + value);
}
// 方式4: 使用 Lambda 表达式 (Java 8+)
System.out.println("\n=== 方式4: Lambda ===");
cities.forEach((key, value) -> {
System.out.println(key + " -> " + value);
});
// 方式5: 使用 Stream API (Java 8+)
System.out.println("\n=== 方式5: Stream API ===");
cities.entrySet().stream()
.filter(entry -> entry.getKey().startsWith("北"))
.forEach(System.out::println);
}
}
学生成绩管理系统案例
import java.util.HashMap;
import java.util.Map;
import java.util.ArrayList;
import java.util.List;
public class StudentGradeSystem {
private HashMap<String, ArrayList<Integer>> studentGrades;
public StudentGradeSystem() {
studentGrades = new HashMap<>();
}
// 添加学生成绩
public void addGrade(String name, int grade) {
studentGrades.computeIfAbsent(name, k -> new ArrayList<>()).add(grade);
}
// 获取学生平均分
public double getAverage(String name) {
ArrayList<Integer> grades = studentGrades.get(name);
if (grades == null || grades.isEmpty()) {
return 0.0;
}
return grades.stream().mapToInt(Integer::intValue).average().orElse(0.0);
}
// 获取所有学生的平均分
public Map<String, Double> getAllAverages() {
Map<String, Double> averages = new HashMap<>();
for (Map.Entry<String, ArrayList<Integer>> entry : studentGrades.entrySet()) {
averages.put(entry.getKey(), getAverage(entry.getKey()));
}
return averages;
}
// 打印所有成绩
public void printAllGrades() {
studentGrades.forEach((name, grades) -> {
System.out.println(name + ": " + grades + " (平均分: " + getAverage(name) + ")");
});
}
public static void main(String[] args) {
StudentGradeSystem system = new StudentGradeSystem();
// 添加学生成绩
system.addGrade("张三", 85);
system.addGrade("张三", 90);
system.addGrade("张三", 88);
system.addGrade("李四", 75);
system.addGrade("李四", 82);
system.addGrade("王五", 95);
// 打印所有成绩
system.printAllGrades();
// 获取特定学生平均分
System.out.println("\n张三平均分: " + system.getAverage("张三"));
// 获取所有学生平均分
System.out.println("\n所有学生平均分: " + system.getAllAverages());
}
}
单词计数器案例
import java.util.HashMap;
import java.util.Map;
public class WordCounter {
public static Map<String, Integer> countWords(String text) {
Map<String, Integer> wordCount = new HashMap<>();
// 清理文本并分割单词
String[] words = text.toLowerCase()
.replaceAll("[^a-zA-Z\\s]", "")
.split("\\s+");
for (String word : words) {
if (!word.isEmpty()) {
// 方法1: 传统方式
// if (wordCount.containsKey(word)) {
// wordCount.put(word, wordCount.get(word) + 1);
// } else {
// wordCount.put(word, 1);
// }
// 方法2: 使用 getOrDefault
// wordCount.put(word, wordCount.getOrDefault(word, 0) + 1);
// 方法3: 使用 merge (Java 8+)
wordCount.merge(word, 1, Integer::sum);
}
}
return wordCount;
}
public static void main(String[] args) {
String text = "Hello World Hello Java Hello World Java Programming";
Map<String, Integer> wordCount = countWords(text);
System.out.println("单词统计结果:");
wordCount.forEach((word, count) -> {
System.out.println(word + ": " + count + "次");
});
// 找出出现次数最多的单词
String mostFrequent = wordCount.entrySet()
.stream()
.max(Map.Entry.comparingByValue())
.map(Map.Entry::getKey)
.orElse("无");
System.out.println("\n出现最多的单词: " + mostFrequent +
" (" + wordCount.get(mostFrequent) + "次)");
}
}
缓存实现案例
import java.util.HashMap;
import java.util.Map;
public class SimpleCache<K, V> {
private final Map<K, V> cache = new HashMap<>();
private final long ttl; // 过期时间(毫秒)
private final Map<K, Long> timestamps = new HashMap<>();
public SimpleCache(long ttl) {
this.ttl = ttl;
}
// 添加缓存
public void put(K key, V value) {
cache.put(key, value);
timestamps.put(key, System.currentTimeMillis());
System.out.println("缓存添加: " + key + " -> " + value);
}
// 获取缓存
public V get(K key) {
Long timestamp = timestamps.get(key);
if (timestamp == null) {
return null;
}
// 检查是否过期
if (System.currentTimeMillis() - timestamp > ttl) {
cache.remove(key);
timestamps.remove(key);
System.out.println("缓存已过期: " + key);
return null;
}
return cache.get(key);
}
// 清除过期缓存
public void clearExpired() {
long now = System.currentTimeMillis();
timestamps.entrySet().removeIf(entry -> {
if (now - entry.getValue() > ttl) {
cache.remove(entry.getKey());
return true;
}
return false;
});
}
// 获取缓存大小
public int size() {
return cache.size();
}
public static void main(String[] args) throws InterruptedException {
// 创建5秒过期时间的缓存
SimpleCache<String, String> cache = new SimpleCache<>(5000);
// 添加缓存
cache.put("user1", "张三");
cache.put("user2", "李四");
// 立即获取
System.out.println("立即获取: " + cache.get("user1"));
// 等待3秒
Thread.sleep(3000);
System.out.println("3秒后获取: " + cache.get("user1"));
// 等待3秒(总共6秒,超过5秒)
Thread.sleep(3000);
System.out.println("6秒后获取: " + cache.get("user1"));
System.out.println("当前缓存大小: " + cache.size());
// 清除过期缓存
cache.clearExpired();
System.out.println("清除后缓存大小: " + cache.size());
}
}
HashMap 常用方法和注意事项
import java.util.HashMap;
import java.util.Map;
public class HashMapTipsExample {
public static void main(String[] args) {
// 1. 初始化容量和负载因子
HashMap<String, Integer> map1 = new HashMap<>(16, 0.75f);
// 2. 使用 putIfAbsent 避免覆盖
Map<String, String> config = new HashMap<>();
config.put("timeout", "5000");
config.putIfAbsent("timeout", "10000"); // 不会覆盖
System.out.println("timeout: " + config.get("timeout")); // 输出: 5000
// 3. 使用 computeIfAbsent 懒加载
Map<String, List<String>> groups = new HashMap<>();
groups.computeIfAbsent("group1", k -> new ArrayList<>()).add("member1");
System.out.println("group1: " + groups.get("group1"));
// 4. 使用 getOrDefault 避免空指针
Map<String, Integer> scores = new HashMap<>();
scores.put("张三", 95);
System.out.println("李四成绩: " + scores.getOrDefault("李四", 0));
// 5. 使用 replace 方法
scores.replace("张三", 95, 100); // 只有当值为95时才替换为100
System.out.println("张三新成绩: " + scores.get("张三"));
// 6. 合并操作
scores.merge("张三", 10, Integer::sum); // 如果存在则相加,否则添加
System.out.println("张三合并后成绩: " + scores.get("张三"));
// 7. 注意事项:自定义对象作为key时需要重写equals和hashCode
Map<Person, String> personMap = new HashMap<>();
personMap.put(new Person("张三", 20), "学生");
personMap.put(new Person("李四", 25), "老师");
System.out.println("张三角色: " + personMap.get(new Person("张三", 20)));
}
static class Person {
String name;
int age;
Person(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;
Person person = (Person) o;
return age == person.age && name.equals(person.name);
}
@Override
public int hashCode() {
return 31 * name.hashCode() + age;
}
}
}
HashMap 的主要特点:
- 基于哈希表实现,查询速度 O(1)
- 允许 null 键和 null 值
- 非线程安全
- 无序(不保证顺序)
使用建议:
- 预估容量,避免频繁扩容
- 自定义对象作为 key 时重写 equals 和 hashCode
- 多线程环境使用 ConcurrentHashMap
- 需要有序时使用 LinkedHashMap 或 TreeMap
这些案例涵盖了 HashMap 的常见使用场景,你可以根据实际需求选择合适的实现方式。
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播