# Map基础

作者:Ethan.Yang
博客:https://blog.ethanyang.cn (opens new window)


Map 是 Java 集合框架中用于存储键值对(key-value)映射关系的接口。每个 key 是唯一的,value 可重复。

# 一、HashMap

# 特点:

  • Java 最常用的 Map 实现,底层由 数组 + 链表 + 红黑树(JDK 1.8后) 组成。
  • key 无序,允许一个 null 键和多个 null 值。
  • 线程不安全,适用于单线程场景。

# 应用场景:

  • 快速查找/插入/删除操作。
  • 不关心顺序,且单线程场景。

# 示例代码:

import java.util.HashMap;

public class HashMapDemo {
    public static void main(String[] args) {
        HashMap<String, Integer> map = new HashMap<>();
        map.put("Java", 1);
        map.put("Python", 2);
        map.put(null, 3); // 允许一个null键

        System.out.println("HashMap内容:" + map);
    }
}
1
2
3
4
5
6
7
8
9
10
11
12

# 二、LinkedHashMap

# 特点:

  • HashMap 的子类,底层通过 双向链表 维护插入顺序。
  • 迭代输出顺序与插入顺序一致。
  • 性能略低于 HashMap,但顺序可控。

# 应用场景:

  • 需要保持 key 的插入顺序。
  • 如实现简单的 LRU 缓存。

# 示例代码:

import java.util.LinkedHashMap;

public class LinkedHashMapDemo {
    public static void main(String[] args) {
        LinkedHashMap<String, Integer> map = new LinkedHashMap<>();
        map.put("C", 1);
        map.put("A", 2);
        map.put("B", 3);

        System.out.println("插入顺序保留:" + map);
    }
}
1
2
3
4
5
6
7
8
9
10
11
12

# 三、TreeMap

# 特点:

  • 基于 红黑树 实现。
  • key 自动按 自然顺序(或指定 Comparator) 排序。
  • 不允许 null 键。

# 应用场景:

  • 需要对 key 进行排序存储。
  • 如:字典、排行榜、范围查询。

# 示例代码:

import java.util.TreeMap;

public class TreeMapDemo {
    public static void main(String[] args) {
        TreeMap<String, Integer> map = new TreeMap<>();
        map.put("Banana", 2);
        map.put("Apple", 1);
        map.put("Orange", 3);

        System.out.println("自动排序:" + map);
    }
}
1
2
3
4
5
6
7
8
9
10
11
12

# 四、ConcurrentHashMap

# 特点:

  • Java 并发包中的线程安全 Map 实现。
  • JDK 1.7 基于分段锁(Segment),JDK 1.8 改为 CAS + synchronized + 链表/红黑树
  • 不允许 null 键或 null 值。

# 应用场景:

  • 多线程环境下高性能的 Map 使用场景。
  • 如:Web缓存、本地并发上下文等。

# 示例代码:

import java.util.concurrent.ConcurrentHashMap;

public class ConcurrentHashMapDemo {
    public static void main(String[] args) {
        ConcurrentHashMap<String, Integer> map = new ConcurrentHashMap<>();
        map.put("Java", 1);
        map.put("Go", 2);

        System.out.println("线程安全的Map:" + map);
    }
}
1
2
3
4
5
6
7
8
9
10
11