java基础篇:map

前言

在 Java 开发中,Map 是一种非常常见的数据结构,用于存储键值对(key-value)。它提供了高效的查找、插入和删除操作,适用于各种应用场景,如缓存、索引、配置管理等。

本文将深入解析 Map 接口的常见实现,包括 HashMap、LinkedHashMap 和 TreeMap,并分析它们的使用场景和底层实现。

1. Map 体系结构

Map 是 Java java.util 包下的一个接口,它的主要特点包括:

键唯一:Map 的 key 不能重复,否则后插入的 value 会覆盖前一个。高效查询:相比 List,Map 能够通过 key 快速找到对应的 value。不同实现方式:Map 具有多个不同的实现,如 HashMap、LinkedHashMap、TreeMap 等。

Map 的常见实现类关系如下:

2. HashMap —— 基于哈希表的实现

2.1 HashMap 介绍

HashMap 是 Map 接口最常用的实现类,它基于 哈希表(Hash Table),支持快速的插入、删除和查找操作。它的特点包括:

允许 null 键和 null 值。无序存储,元素的存储顺序可能会发生变化。线程不安全,需要使用 Collections.synchronizedMap() 或 ConcurrentHashMap 来保证线程安全。

2.2 HashMap 示例代码

import java.util.HashMap;

import java.util.Map;

public class HashMapExample {

public static void main(String[] args) {

Map hashMap = new HashMap<>();

hashMap.put("Apple", 10);

hashMap.put("Banana", 20);

hashMap.put("Cherry", 30);

System.out.println("HashMap: " + hashMap);

}

}

3. LinkedHashMap —— 有序的 HashMap

3.1 LinkedHashMap 介绍

LinkedHashMap 是 HashMap 的子类,与 HashMap 的主要区别是 它维护了元素的插入顺序。

3.2 LinkedHashMap 示例代码

import java.util.LinkedHashMap;

import java.util.Map;

public class LinkedHashMapExample {

public static void main(String[] args) {

Map linkedHashMap = new LinkedHashMap<>();

linkedHashMap.put("Apple", 10);

linkedHashMap.put("Banana", 20);

linkedHashMap.put("Cherry", 30);

System.out.println("LinkedHashMap: " + linkedHashMap);

}

}

输出:

LinkedHashMap: {Apple=10, Banana=20, Cherry=30}

可以看出,元素的存储顺序 按照插入顺序 进行排列。

4. TreeMap —— 基于红黑树的实现

4.1 TreeMap 介绍

TreeMap 是基于 红黑树(Red-Black Tree) 实现的 Map,它的特点包括:

自动排序:TreeMap 的 key 默认按照自然顺序(Comparable)排序,或者可以通过 Comparator 自定义排序。不允许 null 作为 key,但允许 null 作为 value。查找效率为 O(log N),比 HashMap 慢,但适用于需要排序的场景。

4.2 TreeMap 示例代码

import java.util.Map;

import java.util.TreeMap;

public class TreeMapExample {

public static void main(String[] args) {

Map treeMap = new TreeMap<>();

treeMap.put("Banana", 20);

treeMap.put("Apple", 10);

treeMap.put("Cherry", 30);

System.out.println("TreeMap: " + treeMap);

}

}

输出:

TreeMap: {Apple=10, Banana=20, Cherry=30}

可以看出,TreeMap 会根据 key 自动排序。

6. 遍历 Map 的不同方式

6.1 使用 for-each 遍历 entrySet

for (Map.Entry entry : map.entrySet()) {

System.out.println(entry.getKey() + " -> " + entry.getValue());

}

6.2 使用 forEach 方法(Java 8+)

map.forEach((key, value) -> System.out.println(key + " -> " + value));

6.3 使用 keySet 遍历 key

for (String key : map.keySet()) {

System.out.println("Key: " + key);

}

6.4 使用 values 遍历 value

for (Integer value : map.values()) {

System.out.println("Value: " + value);

}

7. HashMap vs. LinkedHashMap vs. TreeMap

特性HashMapLinkedHashMapTreeMap数据结构数组 + 链表 + 红黑树数组 + 链表 + 红黑树红黑树是否有序❌ 无序✅ 按插入顺序✅ 按 key 排序是否允许 null key✅ 允许✅ 允许❌ 不允许查找效率O(1)(最好情况)O(1)O(log N)适用场景快速查找、无序存储需要按插入顺序迭代需要 key 自动排序

8. 结语

在 Java 开发中,Map 是一个强大的数据结构,针对不同的使用需求,我们可以选择合适的 Map 实现:

需要 高效查询,选择 HashMap。需要 按插入顺序存储,选择 LinkedHashMap。需要 自动排序,选择 TreeMap。

掌握 Map 的不同实现和遍历方式,将有助于编写更高效、更合理的数据结构代码!💡

如果觉得这篇博客对你有帮助,记得点赞 ⭐、收藏 📌、关注 🚀!