java map集合,体系特点常用方法;遍历方式,键值对;遍历方式-lambda;综合案例和map集合实现类

1. Java Map 集合体系

Map(接口) —— 键值对存储,key 唯一,value 可重复
 ├── HashMap              // 无序,允许一个 null 键,多个 null 值
 │    └── LinkedHashMap   // 按插入顺序遍历
 ├── TreeMap              // 按键排序(自然顺序/自定义比较器)
 ├── Hashtable            // 线程安全(老版本,性能低)
 └── ConcurrentHashMap    // 高并发线程安全 Map


2. Map 的特点

  • 键值对存储key 唯一,value 可重复

  • 无索引,通过 key 访问

  • null 支持

    • HashMap / LinkedHashMap:允许 1 个 null 键,多个 null 值

    • TreeMap:不允许 null 键

    • Hashtable / ConcurrentHashMap:不允许 null 键/值

  • 线程安全

    • 单线程建议 HashMap / LinkedHashMap / TreeMap

    • 多线程建议 ConcurrentHashMap


3. Map 常用方法

方法说明
V put(K key, V value)添加/替换键值对
V get(Object key)根据键取值
V remove(Object key)删除指定键的映射
boolean containsKey(Object key)是否包含指定键
boolean containsValue(Object value)是否包含指定值
int size()元素个数
boolean isEmpty()是否为空
void clear()清空
Set<K> keySet()获取所有键
Collection<V> values()获取所有值
Set<Map.Entry<K,V>> entrySet()获取所有键值对


4. Map 遍历方式

4.1 遍历键 → 取值

for (String key : map.keySet()) {
    System.out.println(key + " = " + map.get(key));
}

4.2 遍历所有值

for (String value : map.values()) {
    System.out.println(value);
}

4.3 遍历键值对(entrySet,效率高)

for (Map.Entry<String, Integer> entry : map.entrySet()) {
    System.out.println(entry.getKey() + " : " + entry.getValue());
}

4.4 使用 Iterator

Iterator<Map.Entry<String, Integer>> it = map.entrySet().iterator();
while (it.hasNext()) {
    Map.Entry<String, Integer> entry = it.next();
    System.out.println(entry.getKey() + " -> " + entry.getValue());
}

4.5 Lambda 遍历(Java 8+)

map.forEach((k, v) -> System.out.println(k + " : " + v));


5. Map 常用实现类及底层原理

5.1 HashMap

  • 存储结构:JDK 1.8 之后 → 数组 + 链表 + 红黑树(解决哈希冲突)

  • 线程不安全,效率高

  • 哈希冲突hashCode() 冲突时用链表存储,链表长度超过 8 转换为红黑树

  • 时间复杂度:增删改查平均 O(1)

5.2 LinkedHashMap

  • 特点:在 HashMap 基础上加 双向链表,保持插入顺序

  • 适合:需要按顺序遍历的场景

5.3 TreeMap

  • 特点:键有序(默认自然顺序 / 自定义 Comparator

  • 底层:红黑树

  • 时间复杂度:增删改查 O(log n)

5.4 Hashtable

  • 线程安全(方法加 synchronized),但效率低

  • 不允许 null 键和值

5.5 ConcurrentHashMap

  • 线程安全(分段锁 / CAS)

  • 不允许 null 键和值

  • 高并发性能好


6. 综合案例

统计一句话中每个单词出现的次数

import java.util.*;

public class WordCount {
    public static void main(String[] args) {
        String text = "java map java hashMap map lambda";
        Map<String, Integer> wordCount = new HashMap<>();

        for (String word : text.split(" ")) {
            wordCount.put(word, wordCount.getOrDefault(word, 0) + 1);
        }

        // 遍历输出(lambda)
        wordCount.forEach((k, v) -> System.out.println(k + " 出现 " + v + " 次"));
    }
}

运行结果

java 出现 2 次
map 出现 2 次
hashMap 出现 1 次
lambda 出现 1 次
  root((Java Map集合))
    体系结构
      HashMap:::hashmap
        ▪️特点
          ⚠️ 无序 | 🔑 允许null键 | ⚡ 线程不安全
        ▪️底层结构
          JDK8前: 数组+链表:::list
          JDK8+: 数组+链表+红黑树:::tree
      LinkedHashMap:::linked
        ▪️ 特点: 双向链表维持顺序
        🔄 插入顺序/访问顺序
      TreeMap:::treemap
        ▪️ 特点: 红黑树结构
        🔼 自然排序 | 🔽 比较器排序
      Hashtable:::sync
        ⚠️ 线程安全(synchronized)
        ❌ 不允许null键
      ConcurrentHashMap:::conc
        ▪️ JDK7: 分段锁🔒
        ▪️ JDK8: CAS⚙️ + synchronized
    核心特点
      ▪️ 存储结构: key-value pairs
      🔑 Key: 唯一 | 🎨 Value: 可重复
      ⚠️ Null支持: 依实现类而定
    常用方法
      ▪️ 修改
        ✏️ put(K,V) | 🗑️ remove(K)
      ▪️ 查询
        🔍 get(K) | 📌 containsKey(K)
      ▪️ 工具
        📏 size() | 🧹 clear()
    遍历方式
      🔄 keySet()
      🔄 values()
      🔄 entrySet()
      λ forEach()
    应用案例
      📚 单词频率统计
      👥 用户ID映射对象

示意图:

           ┌───────────┐
           │ Java Map  │
           └─────┬─────┘
        ┌────────┴───────┐
   ┌────▼────┐    ┌──────▼──────┐
   │HashMap  │    │Concurrent   │
   │  🟠     │    │HashMap  🔵  │
   └────┬────┘    └──────┬──────┘
        │  ┌───────┐     │
        └─▶│JDK8:  │◀────┘
           │数组+  │
           │红黑树 🌳│
           └───────┘
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

星空下的DeppBing

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值