JAVASE:集合进阶---Map集合

在 Java 中,Map 是一种存储键值对的数据结构,它不属于 Collection 接口,但同样是 Java 集合框架的重要组成部分。Map 提供了通过键快速查找对应值的能力,每个键在 Map 中是唯一的。

基本概念

键值对(Entry):Map 中的每个元素由一个键(Key)和一个值(Value)组成。
键的唯一性:同一个 Map 中不能存在两个相同的键。
值的允许重复:不同的键可以对应相同的值。

常用的 Map 实现类

Java 提供了多种 Map 接口的实现,最常用的有:
HashMap:基于哈希表实现,无序,允许 null 键和 null 值,线程不安全。
TreeMap:基于红黑树实现,按键的自然顺序或自定义比较器排序,不允许 null 键。
LinkedHashMap:继承自 HashMap,维护插入顺序或访问顺序,允许 null 键和 null 值。
Hashtable:线程安全的哈希表,不允许 null 键和 null 值,已基本被 ConcurrentHashMap 取代。
ConcurrentHashMap:线程安全的哈希表,支持高效并发操作,允许多个线程同时访问。

Map 的基本操作

下面是 Map 的基本操作示例:

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

public class MapExample {
    public static void main(String[] args) {
        // 创建一个 HashMap 实例
        Map<String, Integer> scores = new HashMap<>();

        // 添加键值对
        scores.put("Alice", 95);
        scores.put("Bob", 80);
        scores.put("Charlie", 90);
        scores.put("David", 85);

        // 获取值
        System.out.println("Bob 的分数: " + scores.get("Bob")); // 输出: 80

        // 检查键是否存在
        System.out.println("是否包含 Alice: " + scores.containsKey("Alice")); // 输出: true

        // 检查值是否存在
        System.out.println("是否有 90 分: " + scores.containsValue(90)); // 输出: true

        // 获取大小
        System.out.println("Map 大小: " + scores.size()); // 输出: 4

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

        // 删除键值对
        scores.remove("Charlie");
        System.out.println("删除 Charlie 后: " + scores); // 输出: {Alice=95, Bob=80, David=85}

        // 替换值
        scores.replace("Bob", 85);
        System.out.println("Bob 的新分数: " + scores.get("Bob")); // 输出: 85
    }
}

使用 Lambda 表达式遍历 Map

Java 8 引入的 Lambda 表达式使 Map 的遍历更加简洁:

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

public class MapLambdaExample {
    public static void main(String[] args) {
        Map<String, Integer> scores = new HashMap<>();
        scores.put("Alice", 95);
        scores.put("Bob", 80);
        scores.put("Charlie", 90);

        // 使用 forEach 和 Lambda 表达式遍历
        scores.forEach((name, score) -> {
            System.out.println(name + ": " + score);
        });

        // 计算总分
        int totalScore = scores.values().stream()
                .mapToInt(Integer::intValue)
                .sum();
        System.out.println("总分: " + totalScore);
    }
}

TreeMap 排序示例

TreeMap 会根据键的自然顺序或自定义比较器进行排序:

import java.util.Map;
import java.util.TreeMap;

public class TreeMapExample {
    public static void main(String[] args) {
        // 使用 TreeMap 按键的自然顺序排序(字符串按字典序)
        Map<String, Integer> treeMap = new TreeMap<>();
        treeMap.put("Charlie", 90);
        treeMap.put("Alice", 95);
        treeMap.put("Bob", 80);

        // 输出按字典序排序的键值对
        System.out.println("按字典序排序:");
        treeMap.forEach((name, score) -> System.out.println(name + ": " + score));

        // 使用自定义比较器(按字符串长度排序)
        Map<String, Integer> lengthMap = new TreeMap<>((s1, s2) -> 
            Integer.compare(s1.length(), s2.length())
        );
        lengthMap.put("Charlie", 90);
        lengthMap.put("Alice", 95);
        lengthMap.put("Bob", 80);

        // 输出按字符串长度排序的键值对
        System.out.println("\n按字符串长度排序:");
        lengthMap.forEach((name, score) -> System.out.println(name + ": " + score));
    }
}

注意事项

键的哈希与相等性:当使用自定义对象作为键时,需要正确重写 hashCode() 和 equals() 方法。
线程安全:在多线程环境中,优先使用 ConcurrentHashMap 而非 Hashtable。
性能考虑:HashMap 的基本操作(get/put)时间复杂度为 O (1),TreeMap 为 O (log n)。
掌握 Map 集合是 Java 编程的基础,它在实际开发中应用广泛,例如缓存数据、统计频率、配置管理等场景。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

孤独又灿烂的神

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

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

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

打赏作者

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

抵扣说明:

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

余额充值