Map 是 Java 中用于存储键值对的集合接口。以下是对 Map 的详细介绍:
特点
键值对存储:每个元素包含一个键和一个值。
键唯一:键不能重复,但值可以重复。
无序/有序:根据具体实现,键值对的顺序可能无序(如 HashMap)或有序(如 TreeMap、LinkedHashMap)。
主要实现类
HashMap
基于哈希表,无序存储。
允许一个 null 键和多个 null 值。
LinkedHashMap
继承自 HashMap,维护插入顺序。
适合需要按插入顺序遍历的场景。
TreeMap
基于红黑树,按键的自然顺序或比较器排序。
不允许 null 键。
常用方法
put(K key, V value)
:添加键值对。
size()
: 获取集合大小
get(Object key)
:获取键对应的值。
remove(Object key)
:移除指定键的键值对。
containsKey(Object key)
:检查是否包含指定键。
containsValue(Object value)
:检查是否包含指定值。
keySet()
:返回所有键的集合。
values()
:返回所有值的集合。
entrySet()
:返回键值对的集合。
clear()
: 清空集合。
isEmpty()
: 判断集合是否为空
遍历方法
1.使用键值遍历
Map<String, String> m = new HashMap<>();
m.put("aaa","a");
m.put("bbb","b");
m.put("ccc","c");
m.put("ddd","d");
Set<String> s = m.keySet();
for(String c :s){
System.out.println(c+":"+m.get(c));
}
// aaa:a
// ccc:c
// bbb:b
// ddd:d
2.entry
entrySet():返回包含所有键值对的 Set 视图。
Map.Entry:表示一个键值对,可以通过 getKey() 和 getValue() 方法访问键和值。
Map<String, String> m = new HashMap<>();
m.put("aaa","a");
m.put("bbb","b");
m.put("ccc","c");
m.put("ddd","d");
for(Map.Entry<String, String> it:m.entrySet()){
System.out.println(it.getKey() + ":" + it.getValue());
}
// aaa:a
// ccc:c
// bbb:b
// ddd:d
3.Lambda表达式
Map<String, String> m = new HashMap<>();
m.put("aaa","a");
m.put("bbb","b");
m.put("ccc","c");
m.put("ddd","d");
m.forEach( (s, s2) -> System.out.println(s + ":" + s2));
// aaa:a
// ccc:c
// bbb:b
// ddd:d
子类
HashMap
底层原理
数据结构:基于哈希表。
哈希函数:通过 hashCode() 计算哈希值。
哈希冲突:使用链表或红黑树(Java 8 及以上)处理。
扩容机制:当元素数量超过阈值(负载因子 x 当前容量)时扩容。
应用场景
适用于需要快速插入、删除、和查找的场景。
无序存储,不保证顺序。
LinkedHashMap
底层原理
继承自 HashMap:保持哈希表结构。
双向链表:维护元素的插入顺序。
顺序性:按插入顺序或访问顺序(可选)存储。
应用场景
需要保持元素插入顺序的场景。
实现缓存(可按访问顺序排序)。
TreeMap
底层原理
红黑树:自平衡的二叉搜索树。
排序:按自然顺序或自定义比较器排序键。
不允许 null 键:因为需要排序比较。
应用场景
需要有序存储键值对的场景。
需要范围查询或按顺序遍历。