跳转至

集合框架与泛型:Map集合

概述

在Java中,Map接口是集合框架的一部分,用于存储键值对(key-value pairs)。与ListSet不同,Map中的元素是无序的,并且每个键只能映射到一个值。Map接口的常见实现类包括HashMapTreeMapLinkedHashMap

Map接口的基本概念

键值对

Map中的每个元素都是一个键值对,其中键(key)是唯一的,而值(value)可以重复。通过键可以快速查找对应的值。

常用方法

  • put(K key, V value):将指定的键值对插入到Map中。
  • get(Object key):返回指定键所映射的值。
  • remove(Object key):移除指定键的映射。
  • containsKey(Object key):判断Map中是否包含指定的键。
  • containsValue(Object value):判断Map中是否包含指定的值。
  • keySet():返回Map中所有键的集合。
  • values():返回Map中所有值的集合。
  • entrySet():返回Map中所有键值对的集合。

Map的实现类

HashMap

HashMap是最常用的Map实现类,它基于哈希表实现,允许null键和null值。HashMap不保证元素的顺序。

TreeMap

TreeMap基于红黑树实现,元素按照键的自然顺序或自定义比较器排序。TreeMap不允许null键,但允许null值。

LinkedHashMap

LinkedHashMapHashMap的子类,它维护了一个双向链表,因此可以保持元素的插入顺序或访问顺序。

代码示例

示例1:使用HashMap存储和检索数据

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

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

        // 向Map中添加键值对
        map.put("Alice", 25);
        map.put("Bob", 30);
        map.put("Charlie", 35);

        // 通过键获取值
        System.out.println("Alice's age: " + map.get("Alice")); // 输出: Alice's age: 25

        // 遍历Map中的所有键值对
        for (Map.Entry<String, Integer> entry : map.entrySet()) {
            System.out.println(entry.getKey() + " is " + entry.getValue() + " years old.");
        }
    }
}

示例2:使用TreeMap按自然顺序排序

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

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

        // 向Map中添加键值对
        map.put("Charlie", 35);
        map.put("Alice", 25);
        map.put("Bob", 30);

        // 遍历Map中的所有键值对,按键的自然顺序排序
        for (Map.Entry<String, Integer> entry : map.entrySet()) {
            System.out.println(entry.getKey() + " is " + entry.getValue() + " years old.");
        }
    }
}

示例3:使用LinkedHashMap保持插入顺序

import java.util.LinkedHashMap;
import java.util.Map;

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

        // 向Map中添加键值对
        map.put("Charlie", 35);
        map.put("Alice", 25);
        map.put("Bob", 30);

        // 遍历Map中的所有键值对,保持插入顺序
        for (Map.Entry<String, Integer> entry : map.entrySet()) {
            System.out.println(entry.getKey() + " is " + entry.getValue() + " years old.");
        }
    }
}

练习题

练习1:统计字符串中每个字符出现的次数

编写一个程序,使用HashMap统计给定字符串中每个字符出现的次数。例如,输入字符串"hello",输出应为{h=1, e=1, l=2, o=1}

练习2:按值排序Map

编写一个程序,使用TreeMapHashMap中的值进行排序。例如,给定HashMap {Alice=25, Bob=30, Charlie=35},输出应为{Alice=25, Bob=30, Charlie=35}

练习3:实现一个简单的电话簿

使用LinkedHashMap实现一个简单的电话簿程序,允许用户添加、删除和查找联系人。要求程序能够保持联系人的插入顺序。

总结

  • Map接口用于存储键值对,键是唯一的,值可以重复。
  • HashMap是最常用的Map实现类,基于哈希表实现,不保证顺序。
  • TreeMap基于红黑树实现,按键的自然顺序或自定义比较器排序。
  • LinkedHashMapHashMap的子类,可以保持元素的插入顺序或访问顺序。
  • 常用的Map方法包括putgetremovecontainsKeycontainsValuekeySetvaluesentrySet

通过本主题的学习,你应该能够理解Map接口的基本概念,并能够使用HashMapTreeMapLinkedHashMap进行数据的存储和操作。