251. Java 集合 - 管理 Map 的内容

80 阅读3分钟

251. Java 集合 - 管理 Map 的内容


1. ➕ 向 Map 添加键值对

在 Map 中添加数据非常简单:

  • 使用 put(key, value) 方法
  • 如果键不存在,就直接添加新的键值对。
  • 如果键已存在,则用新的值替换旧值

🧠 小知识

  • put() 方法总是返回这个键之前绑定的值。
  • 如果是新增的键,那么返回的是 null

📖 示例:使用 put()

import java.util.HashMap;
import java.util.Map;

public class PutExample {
    public static void main(String[] args) {
        Map<String, String> map = new HashMap<>();
        
        String oldValue = map.put("apple", "red");
        System.out.println("Old value for 'apple': " + oldValue); // null

        oldValue = map.put("apple", "green");
        System.out.println("Old value for 'apple': " + oldValue); // red
    }
}

总结

  • 第一次添加 "apple",返回 null
  • 第二次添加 "apple",原来绑定的 "red" 被返回,并且值更新为 "green"

2. ✨ 使用 putIfAbsent() 更智能地添加

Java 8 新增了 putIfAbsent(key, value) 方法:

  • 仅当这个键不存在对应值为 null时,才添加新的键值对!
  • 如果已有非空值,则保持不变。

🚨 注意

如果某个键已经存在,但值是 nullputIfAbsent() 也会将其替换成新的值!


📖 示例:使用 putIfAbsent()

import java.util.HashMap;
import java.util.Map;

public class PutIfAbsentExample {
    public static void main(String[] args) {
        Map<String, Integer> map = new HashMap<>();
        
        map.put("one", 1);
        map.put("two", null);
        map.put("three", 3);

        map.putIfAbsent("two", 2);  // "two" 的值是 null,因此会被替换
        map.putIfAbsent("three", 33); // "three" 已经是 3,不会替换

        System.out.println(map);
    }
}

输出:

{one=1, two=2, three=3}

3. ❗ 注意:null 值导致的问题

假设 Map 中存在一些 null 值,直接遍历可能导致空指针异常(NullPointerException)

📖 错误示例:

Map<String, Integer> map = new HashMap<>();
map.put("one", 1);
map.put("two", null);

for (int value : map.values()) { // 自动拆箱 Integer -> int
    System.out.println("value = " + value);
}
  • null 无法自动拆箱为 int,程序运行时报错!

✅ 解决方案:用 putIfAbsent() 替换掉 null

for (String key : map.keySet()) {
    map.putIfAbsent(key, -1); // 将所有为 null 的值替换成 -1
}

这样,遍历时不会再出现异常!

最终输出示例:

value = 1
value = -1

4. 🔍 从 Map 中获取值

可以通过 get(key) 获取指定键对应的值。

如果键不存在,get() 返回 null


✨ 使用 getOrDefault()

Java 8 新增 getOrDefault(key, defaultValue) 方法:

  • 如果键存在,返回对应的值;
  • 如果键不存在,返回指定的默认值

📖 示例:使用 getOrDefault()

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class GetOrDefaultExample {
    public static void main(String[] args) {
        Map<Integer, String> map = new HashMap<>();
        
        map.put(1, "one");
        map.put(2, "two");
        map.put(3, "three");

        List<String> values = new ArrayList<>();
        for (int key = 0; key < 5; key++) {
            values.add(map.getOrDefault(key, "UNDEFINED"));
        }

        System.out.println(values);
    }
}

输出:

[UNDEFINED, one, two, three, UNDEFINED]

5. 🌟 使用 Stream 简化写法(可选进阶)

如果你已经熟悉 Java Stream API,可以用更优雅的方式实现相同功能:

import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
import java.util.stream.IntStream;

public class StreamGetOrDefault {
    public static void main(String[] args) {
        Map<Integer, String> map = new HashMap<>();
        
        map.put(1, "one");
        map.put(2, "two");
        map.put(3, "three");

        List<String> values = IntStream.range(0, 5)
            .mapToObj(key -> map.getOrDefault(key, "UNDEFINED"))
            .collect(Collectors.toList());

        System.out.println(values);
    }
}

输出同样是:

[UNDEFINED, one, two, three, UNDEFINED]

✅ 更加简洁高效!


🎯 小结

方法说明
put(key, value)添加或更新键值对
putIfAbsent(key, value)仅在键不存在或值为 null 时添加
get(key)获取指定键的值,键不存在返回 null
getOrDefault(key, defaultValue)获取指定键的值,键不存在返回默认值

👀 互动问题

问题1put() 方法返回的是什么?

答案示例:返回的是原来绑定到该键的旧值,如果没有旧值则返回 null。

问题2putIfAbsent()put() 有什么区别?

答案示例:putIfAbsent() 只有在键不存在或对应值是 null 时才会添加;put() 则总是覆盖。

问题3:为什么遍历时 null 值会导致空指针异常?

答案示例:因为遍历时需要自动拆箱为基本类型(int),而 null 无法拆箱,会抛出 NullPointerException。