- Map 与 Collection并列存在。用于保存具有映射关系的数据:Key-Value
- Map中的key和value可以是任何引用类型的数据,会封装到HashMap$Node对象中
- Map中的key不允许重复,原因和HashSet一样,前面分析过源码.
- Map中的value可以重复
- Map的key可以为null,value也可以为null,注意key为null,只能有一个,value为null,可以多个.
- 常用 String 类作为 Map 的 key
- key 和 value之间存在单向一对一关系,即通过指定的key总能找到对应的value
- Map存放数据的key-value示意图,一对k-v是放在一个HashMap$Node中的,因为Node实现了Entry接口,有些书上也说 一对k-v就是一个Entry (如图)

Map map = new HashMap();
map.put("1","jack");
map.put("2","Tom");- k-v 最后是
HashMap$Node node = new Node(hash, key, value, null) - k-v 为了方便程序员遍历,还会创建
EntrySet集合,该集合存放的元素 类型 是 Entry,而一个Entry 对象 就有k-v, 也就是Entry<K,V> EntrySet中,定义的类型是 Map.Entry,但是实际上存放的还是HashMap$Node因为static class Node<K,V> implements Map.Entry<K,V>- 当把
HashMap$Node对象存放到 EntrySet 就方便遍历
遍历方式
// 第一组: 先取出 所有的Key, 通过Key 取出对应的Value
Set keyset = map.keySet();
// (1) 增强 for
for (Object key : keyset) {
System.out.println(key + "-" + map.get(key));
}
// (2) 迭代器
Iterator iterator = keyset.iterator();
while (iterator.hasNext()) {
Object key = iterator.next();
System.out.println(key + "-" + map.get(key));
}
// 第二组: 把所有的values取出
Collection values = map.values();
//这里可以使用所有的Collections使用的遍历方法
// (1) 增强 for
for (Object value : values) {
System.out.println(value);
}
// (2) 迭代器
Iterator iterator2 = values.iterator();
while (iterator2.hasNext()) {
Object value = iterator2.next();
System.out.println(value);
}
// 第三组: 通过EntrySet 来获取 k-v
Set entrySet = map.entrySet(); // EntrySet<Map.Entry<K,V>>
//(1) 增强 for
for (Object entry : entrySet) {
//将 entry 转成 Map.Entry
Map.Entry m = (Map.Entry) entry;
System.out.println(m.getKey() + "-" + m.getValue());
}
HashMap<String, Integer> map = new HashMap<>();
map.put("apple", 3);
map.put("banana", 5);
map.put("orange", 2);
for (Map.Entry<String, Integer> entry : map.entrySet()) {
String key = entry.getKey();
Integer value = entry.getValue();
System.out.println(key + " = " + value);
}