Map 分析
特点
- Map 用于保存具有映射关系的数据:key-value(双列元素);
- Map 中的 key 不允许重复,添加相同元素的 key 会将原来这个 key 对应的 value替换掉;
- Map 中的 value 允许重复;
- Map 中的 key 可以为 null,但只能有一个;value 也可以为 null,可以有多个;
- key 和 value 之间存在单向一对一关系,即通过指定的 key 总能找到对应的 value;
- Map 中的 key 和 value 可以是任何引用类型的数据,最后会存储到 Map$Entry 接口类型的实现类对象中。比如 HashMap 会封装到 HashMap$Node 对象,实现了 Map$Entry 接口,所以也可以说一对 k-v 就是一个 Entry;
补充
为了方便遍历,Map 中还维护了一个 entrySet 方法,返回一个集合,存放的元素类型为 Map$Entry,保存了 Map 中 K,V 的元素;(对于 HashMap 来说,实际保存的是 HashMap$Node 类型,Node 实现了 Entry 接口)
Set<Map.Entry<K, V>> entrySet();
Map 中还维护了 keySet() 方法 和 values() 方法来获取 Map 中的 key 集合和 value 集合; ```java Set
keySet(); // 获取Map中key的集合
Collection
遍历:<br />Map$Entry 接口定义了 getKey() 和 getValue() 方法,可以方便的获取 key-value
```java
interface Entry<K,V> {
K getKey();
V getValue();
// ...
}
Map map = new HashMap();
map.put("key","value");
Set set = map.entrySet();
for (Object obj : set) {
System.out.println(obj); // key=value
Map.Entry entry = (Map.Entry) obj;
System.out.println(entry.getKey()); // key
System.out.println(entry.getValue()); // value
}
总结
Map 中存放的元素都是 Map$Entry 接口类型,对于不同的实现子类实现了不同的存储类型。比如 HashMap 存储元素的类型为 HashMap$Node。
Map 接口中还定义了 entrySet(), keySet(), values() 方法,分别用来获取 Map 中存储的元素集合、key 的集合、Value 的集合,详细声明信息见 Map 接口方法
Map 常用接口方法
方法声明 | 方法描述 |
---|---|
int size(); | 返回 Map 中 k-v 的个数 |
boolean isEmpty(); | 返回 Map 是否为空 |
boolean containsKey(Object key); | 返回 Map 中是否包含 key |
boolean containsValue(Object value); | 返回 Map 中是否包含 value |
V get(Object key); | 返回 Map key 对应的 Value值 |
V put(K key, V value); | 向 Map 中添加 key-value 并返回 value |
V remove(Object key); | 删除 Map 中 key 对应的键值对 |
void clear(); | 从此 Map 中删除所有映射(可选操作) |
Set |
获取 Map 中 k 的集合 |
Collection |
获取 Map 中 v 的集合 |
Set |
获取 Map k-v 键值对集合 |
Map 遍历
Map map = new HashMap(); // put 元素略
1. keySet() 获取 key 集合遍历
Set keySet = map.keySet();
// 增强 for
for (Object key : keySet) {
System.out.println(key + "-" + map.get(key))
}
// 迭代器
Iterator iterator = map.keySet().iterator();
while (iterator.hasNext()) {
Object key = iterator.next();
System.out.println(key + "-" + map.get(key));
}
2. values() 获取 value 集合遍历
这个不能获取到 key
Collection values = map.values();
// 增强 for
for (Object value : values) {
System.out.println(value);
}
// 迭代器
Iterator iterator = map.values().iterator();
while (iterator.hasNext()) {
System.out.println(iterator.next());
}
3. entrySet() 获取 entry 集合遍历
Map$Entry 类型提供了获取 key 和 value 的方法,方便遍历。
Set entrySet = map.entrySet();
// 增强 for
for (Object entry : entrySet) {
// 将 entry 转成 Map$Entry 类型
Map.Entry ele = (Map.Entry) entry;
System.out.println(ele.getKey() + "-" + ele.getValue());
System.out.println(ele); // key=value
}
// 迭代器
Iterator iterator = entrySet.iterator();
while (iterator.hasNext()) {
Map.Entry entry = (Map.Entry) iterator.next();
System.out.println(entry.getKey() + "-" + entry.getValue());
System.out.println(entry); // key=value
}