Java基础-Map接口
在Java中,Map
是一个顶层接口(位于java.util
包下),用于存储键值对(key-value) 形式的数据,也称为“映射表”。它提供了一种通过“键(key)”快速查找“值(value)”的机制,类似于现实生活中的“字典”(通过单词查释义)。
Map
的特性
- 键值对结构:每个元素包含两个部分——
key
(键)和value
(值),通过key
可以唯一确定对应的value
。 - 键的唯一性:
Map
中不允许存在重复的key。如果插入相同的key,新的value会覆盖旧的value。 - 值的可重复性:
value
可以重复,多个不同的key可以对应相同的value。 - 泛型支持:通过泛型(
Map<K, V>
)指定key和value的类型,保证类型安全(如Map<String, Integer>
表示key是字符串,value是整数)。
Map
的常用方法
Map
接口定义了一系列操作键值对的方法,核心包括:
V put(K key, V value)
:添加或修改键值对(若key存在则覆盖value)。V get(Object key)
:根据key获取对应的value(若key不存在则返回null
)。V remove(Object key)
:根据key删除键值对,并返回被删除的value。boolean containsKey(Object key)
:判断是否包含指定key。boolean containsValue(Object value)
:判断是否包含指定value。int size()
:返回键值对的数量。Set<K> keySet()
:返回所有key的集合(Set
类型,因为key唯一)。Collection<V> values()
:返回所有value的集合(Collection
类型,因为value可重复)。Set<Map.Entry<K, V>> entrySet()
:返回所有键值对的集合(Entry
是Map
的内部接口,表示一个键值对)。
Map
的主要实现类
Map
是接口,不能直接实例化,常用的实现类有:
HashMap
:- 基于哈希表实现,查询、插入、删除效率高(平均时间复杂度
O(1)
)。 - 无序(键值对的存储顺序与插入顺序无关)。
- 线程不安全(多线程环境下需额外处理同步)。
- 基于哈希表实现,查询、插入、删除效率高(平均时间复杂度
LinkedHashMap
:HashMap
的子类,通过链表维护键值对的插入顺序或访问顺序。- 有序(可保留插入顺序),性能略低于
HashMap
。
TreeMap
:- 基于红黑树实现,键值对会按照key的自然顺序(或自定义比较器)排序。
- 有序(按key排序),查询时间复杂度
O(log n)
,适合需要排序的场景。
Hashtable
:- 早期的哈希表实现,线程安全(方法加了同步锁),但性能较低。
- 已被
HashMap
替代,仅在遗留代码中可能出现。
代码示例
import java.util.HashMap;
import java.util.Map;
import java.util.Set;public class MapExample {public static void main(String[] args) {// 创建HashMap实例(key为String,value为Integer)Map<String, Integer> studentScores = new HashMap<>();// 添加键值对studentScores.put("Alice", 90);studentScores.put("Bob", 85);studentScores.put("Charlie", 95);// 查找value(通过key)int aliceScore = studentScores.get("Alice");System.out.println("Alice的分数:" + aliceScore); // 输出:Alice的分数:90// 遍历所有keySet<String> names = studentScores.keySet();for (String name : names) {System.out.println(name + ":" + studentScores.get(name));}// 判断是否包含某个keyboolean hasBob = studentScores.containsKey("Bob");System.out.println("是否包含Bob:" + hasBob); // 输出:true}
}
总结
Map
接口是Java中存储键值对数据的核心规范,它通过key快速定位value,解决了“通过标识查找数据”的需求。根据是否需要有序、是否线程安全等场景,可以选择不同的实现类(如HashMap
用于高效无序存储,TreeMap
用于排序存储)。