集合框架与泛型: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
进行数据的存储和操作。