Map详解
Map接口的实现类的特点[很实用]
注意:这里讲的是JDK8的Map接口特点
-
Map集合用于保存具有映射关系的数据: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
public class Demo01 {
public static void main(String[] args) {
Map map = new HashMap();
map.put("no1","韩顺平");
map.put("no2","周杰伦");
System.out.println("map="+map);
}
}
- Map中的 key 和 value 可以是任何引用类型的数据,会封装到HashMap$Node对象中
-
当有相同的 key 时,就等价于将value替换,key不替换
public class Demo01 {
public static void main(String[] args) {
Map map = new HashMap();
map.put("no1","韩顺平");
map.put("no2","周杰伦");
map.put("no1", "张三丰");
System.out.println("map="+map);
}
}
-
Map中的 value 可以重复
public class Demo01 {
public static void main(String[] args) {
Map map = new HashMap();
map.put("no1","韩顺平");
map.put("no2","周杰伦");
map.put("no1", "张三丰");
map.put("no3", "张三丰");
System.out.println("map="+map);
}
}
-
key只能有一个null,value可以有多个null
public class Demo01 {
public static void main(String[] args) {
Map map = new HashMap();
map.put(null,null);
map.put(null, "abc"); //相当于替换
map.put("no2", null);
map.put("no3", null);
System.out.println("map="+map);
}
}
-
通过 get() 方法,传入 key ,会返回对应的 value
public class Demo01 {
public static void main(String[] args) {
Map map = new HashMap();
map.put("no1","韩顺平");
map.put("no2","周杰伦");
map.put("no1", "张三丰");
map.put("no3", "张三丰");
System.out.println(map.get("no2"));
}
}
Map中的一对 k-v 是放在一个HashMap$Node中的,又因为Node实现了 Entry 接口,有些书上也说一对 k-y 就是一个Entry
-
k-v 会封装到 HashMap$Node对象中 ,通过 newNode(hash, key, value, null); 存放的
-
HashMap中的静态内部类 Node
//实现的是Map接口中的Entry接口
static class Node<K,V> implements Map.Entry<K,V>
-
k-v 为了方便程序员的遍历,还会创建 EntrySet集合,该集合存放的元素的类型是 Entry,而一个Entry对象就有k-v,EntrySet<Entry<k,v>>
//HashMap中的内部类
final class EntrySet extends AbstractSet<Map.Entry<K,V>> {
-
entrySet中,定义的类型是Map.Entry,但是实际上存放的还是 HashMap$Node,这是因为 static class Node<K,V> implements Map.Entry<K,V>
transient Set<Map.Entry<K,V>> entrySet;
-
当把 HashMap$Node 对象存放到 entrySet中,就方便了我们的遍历,因为 Map.Entry 提供了重要的方法:例如 K getKey(); V getValue(); V setValue(V value)
public class Demo01 {
public static void main(String[] args) {
Map map = new HashMap();
map.put("no1","韩顺平");
map.put("no2","周杰伦");
Set set = map.entrySet();
System.out.println(set.getClass());
System.out.println("============");
for (Object obj : set) {
System.out.println(obj.getClass());
//向下转型取出 k-v
Map.Entry entry = (Map.Entry)obj;
System.out.println(entry.getKey()+"-"+entry.getValue());
}
}
}
-
执行 Set set = map.entrySet();
public Set<Map.Entry<K,V>> entrySet() {
Set<Map.Entry<K,V>> es;
return (es = entrySet) == null ? (entrySet = new EntrySet()) : es;
}