集合框架与泛型:Map集合¶
概述¶
在Java中,Map接口是集合框架的一部分,用于存储键值对(key-value pairs)。与List和Set不同,Map中的元素是无序的,并且每个键只能映射到一个值。Map接口的常见实现类包括HashMap、TreeMap和LinkedHashMap。
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¶
LinkedHashMap是HashMap的子类,它维护了一个双向链表,因此可以保持元素的插入顺序或访问顺序。
代码示例¶
示例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¶
编写一个程序,使用TreeMap对HashMap中的值进行排序。例如,给定HashMap {Alice=25, Bob=30, Charlie=35},输出应为{Alice=25, Bob=30, Charlie=35}。
练习3:实现一个简单的电话簿¶
使用LinkedHashMap实现一个简单的电话簿程序,允许用户添加、删除和查找联系人。要求程序能够保持联系人的插入顺序。
总结¶
Map接口用于存储键值对,键是唯一的,值可以重复。HashMap是最常用的Map实现类,基于哈希表实现,不保证顺序。TreeMap基于红黑树实现,按键的自然顺序或自定义比较器排序。LinkedHashMap是HashMap的子类,可以保持元素的插入顺序或访问顺序。- 常用的
Map方法包括put、get、remove、containsKey、containsValue、keySet、values和entrySet。
通过本主题的学习,你应该能够理解Map接口的基本概念,并能够使用HashMap、TreeMap和LinkedHashMap进行数据的存储和操作。