get(K key)
这是最直接、最常用的方法,用于根据键来获取对应的值。
基本用法
get() 方法的签名是 V get(Object key),它会返回与指定键关联的值。
- 如果找到键:返回对应的值。
- 如果未找到键:返回
null。
示例代码:
import java.util.HashMap;
import java.util.Map;
public class GetValueExample {
public static void main(String[] args) {
// 1. 创建一个 Map 并存入数据
Map<String, Integer> studentScores = new HashMap<>();
studentScores.put("Alice", 95);
studentScores.put("Bob", 88);
studentScores.put("Charlie", 92);
// 2. 使用 get() 方法获取 value
Integer alicesScore = studentScores.get("Alice");
System.out.println("Alice's score: " + alicesScore); // 输出: Alice's score: 95
Integer bobsScore = studentScores.get("Bob");
System.out.println("Bob's score: " + bobsScore); // 输出: Bob's score: 88
// 3. 获取一个不存在的 key
Integer davesScore = studentScores.get("Dave");
System.out.println("Dave's score: " + davesScore); // 输出: Dave's score: null
}
}
重要注意事项:处理 null 值
get() 方法在找不到键时会返回 null,如果你的 Map 中允许 value 为 null,那么你就无法通过返回值 null 来区分是“键不存在”还是“键存在但其值为 null”。
示例:null 值的歧义
Map<String, String> settings = new HashMap<>();
settings.put("timeout", "30");
settings.put("debugMode", null); // 允许 value 为 null
String timeout = settings.get("timeout"); // 返回 "30"
String debugMode = settings.get("debugMode"); // 返回 null
String nonExistent = settings.get("nonExistent"); // 返回 null
// debugMode 和 nonExistent 都是 null,但含义不同
解决方案
为了解决这个问题,Java 提供了一个更安全的方法。
安全获取:getOrDefault(K key, V defaultValue)
这个方法在 Java 8 中引入,非常实用,它会返回与指定键关联的值,如果找不到该键,则返回指定的默认值。
语法:
V getOrDefault(Object key, V defaultValue)
示例代码:
import java.util.HashMap;
import java.util.Map;
public class GetOrDefaultExample {
public static void main(String[] args) {
Map<String, String> settings = new HashMap<>();
settings.put("timeout", "30");
settings.put("debugMode", null);
// 使用 getOrDefault
String timeout = settings.getOrDefault("timeout", "60"); // key 存在,返回 "30"
System.out.println("Timeout: " + timeout); // 输出: Timeout: 30
String debugMode = settings.getOrDefault("debugMode", "false"); // key 存在,值为 null,返回 null
System.out.println("Debug Mode: " + debugMode); // 输出: Debug Mode: null
String nonExistent = settings.getOrDefault("nonExistent", "default_value"); // key 不存在,返回默认值
System.out.println("Non-existent setting: " + nonExistent); // 输出: Non-existent setting: default_value
}
}
优点:
- 彻底消除了
null值的歧义。 - 代码更简洁,避免了繁琐的
if-else判断。
高级用法:获取所有 value
如果你需要获取 Map 中所有的值,而不是单个值,可以使用以下方法。
获取所有值的集合:values()
values() 方法返回一个 Collection<V>,包含了 Map 中的所有值,这个集合是 Map 视图,意味着对 Map 的修改会直接反映在这个集合中。
示例代码:
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
public class GetAllValuesExample {
public static void main(String[] args) {
Map<Integer, String> errorCodes = new HashMap<>();
errorCodes.put(404, "Not Found");
errorCodes.put(500, "Internal Server Error");
errorCodes.put(200, "OK");
// 获取所有 value 的集合
Collection<String> allMessages = errorCodes.values();
System.out.println("All error messages: " + allMessages);
// 输出可能为: All error messages: [Not Found, Internal Server Error, OK]
// (注意:HashMap 的迭代顺序不保证)
// 遍历所有 value
System.out.println("\nIterating through all values:");
for (String message : allMessages) {
System.out.println(message);
}
}
}
结合 Lambda 表达式 (Java 8+)
Java 8 引入的 Stream API 让处理 Map 变得非常强大。
查找并转换:stream().map()
如果你想获取所有 value 并进行一些处理(转换类型或筛选),可以使用 stream()。
示例:获取所有分数并求和
import java.util.HashMap;
import java.util.Map;
public class MapStreamExample {
public static void main(String[] args) {
Map<String, Integer> studentScores = new HashMap<>();
studentScores.put("Alice", 95);
studentScores.put("Bob", 88);
studentScores.put("Charlie", 92);
studentScores.put("David", 75);
// 使用 Stream 获取所有 value 并求和
int totalScore = studentScores.values()
.stream() // 创建一个 value 的流
.mapToInt(Integer::intValue) // 转换为 IntStream
.sum(); // 求和
System.out.println("Total score of all students: " + totalScore); // 输出: Total score of all students: 350
// 使用 Stream 筛选出及格的分数
System.out.println("\nPassing scores:");
studentScores.values()
.stream()
.filter(score -> score >= 60) // 筛选条件
.forEach(System.out::println); // 打印
}
}
| 场景 | 推荐方法 | 说明 |
|---|---|---|
| 获取单个确定的值 | map.get(key) |
最简单直接的方法。 |
| 获取单个值,并处理键不存在的情况 | map.getOrDefault(key, defaultValue) |
强烈推荐,避免 NullPointerException,代码更健壮。 |
| 检查键是否存在,然后获取值 | if (map.containsKey(key)) { ... } |
在需要执行复杂逻辑时使用,比 get + null 判断更清晰。 |
获取 Map 中所有的值 |
Collection<V> values = map.values(); |
获取一个包含所有值的动态视图集合。 |
| 需要对所有值进行计算或转换 | map.values().stream().(...) |
Java 8+ 的现代方式,功能强大,易于并行处理。 |
选择建议:
- 日常开发:优先使用
getOrDefault(),它能让你写出更安全、更简洁的代码。 - 性能要求极高:在确定键一定存在的情况下,
get()的性能略好于getOrDefault(),因为少了一次比较,但在大多数应用中,这个性能差异可以忽略不计。 - 需要批量处理:使用
values()或stream()。
