Map.png

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 接口)

    1. Set<Map.Entry<K, V>> entrySet();
  • Map 中还维护了 keySet() 方法 和 values() 方法来获取 Map 中的 key 集合和 value 集合; ```java Set keySet(); // 获取Map中key的集合

Collection values(); // 获取Map中value的集合

  1. 遍历:<br />Map$Entry 接口定义了 getKey() getValue() 方法,可以方便的获取 key-value
  2. ```java
  3. interface Entry<K,V> {
  4. K getKey();
  5. V getValue();
  6. // ...
  7. }
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 keySet(); 获取 Map 中 k 的集合
Collection values(); 获取 Map 中 v 的集合
Set> entrySet(); 获取 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
}