Java Map 集合
Map 是 Java 集合框架中用于存储键值 对的接口。理解 Map 的实现类和使用方法是处理映射关系的基础。本章将详细介绍 Java 中的 Map 集合。
HashMap、LinkedHashMap、TreeMap
HashMap
**HashMap**是基于哈希表实现的,使用数组+链表+红黑树(Java 8+)结构。
特点:
- 无序:键值对没有固定顺序
- 键唯一:每个 key 只能对应一个 value
- 查找快:平均时间复杂度 O(1)
- 允许 null:key 和 value 都可以为 null(但只能有一个 null key)
- 线程不安全:多线程环境下需要同步
import java.util.HashMap;
import java.util.Map;
Map<String, Integer> map = new HashMap<>();
map.put("apple", 10);
map.put("banana", 20);
map.put("orange", 30);
System.out.println(map); // {banana=20, orange=30, apple=10}(顺序不确定)
System.out.println(map.get("apple")); // 10
LinkedHashMap
**LinkedHashMap**是 HashMap 的子类,使用链表维护插入顺序。
特点:
- 有序:保持插入顺序
- 键唯一:每个 key 只能对应一个 value
- 查找快:平均时间复杂度 O(1)
- 性能略低:比 HashMap 略慢(需要维护链表)
import java.util.LinkedHashMap;
Map<String, Integer> map = new LinkedHashMap<>();
map.put("apple", 10);
map.put("banana", 20);
map.put("orange", 30);
System.out.println(map); // {apple=10, banana=20, orange=30}(保持插入顺序)
TreeMap
**TreeMap**是基于红黑树实现的,按键的自然顺序或指定比较器排序。
特点:
- 有序:按键自动排序
- 键唯一:每个 key 只能对应一个 value
- 查找较慢:时间复杂度 O(log n)
- 支持范围查询:可以高效查询范围内的键
import java.util.TreeMap;
Map<String, Integer> map = new TreeMap<>();
map.put("orange", 30);
map.put("apple", 10);
map.put("banana", 20);
System.out.println(map); // {apple=10, banana=20, orange=30}(按键排序)
key-value 操作
添加和更新
Map<String, Integer> map = new HashMap<>();
// 添加键值对
map.put("apple", 10); // 添加新键值对
map.put("banana", 20); // 添加新键值对
map.put("apple", 30); // 更新已存在的键的值
// 如果不存在则添加
map.putIfAbsent("orange", 40); // 如果 "orange" 不存在,则添加
// 批量添加
Map<String, Integer> anotherMap = new HashMap<>();
anotherMap.put("grape", 50);
anotherMap.put("mango", 60);
map.putAll(anotherMap);
获取值
Map<String, Integer> map = new HashMap<>();
map.put("apple", 10);
map.put("banana", 20);
// 获取值
Integer value = map.get("apple"); // 10
// 获取值,如果不存在返回默认值
Integer value2 = map.getOrDefault("orange", 0); // 0(不存在,返回默认值)
// 检查键是否存在
boolean containsKey = map.containsKey("apple"); // true
// 检查值是否存在
boolean containsValue = map.containsValue(10); // true