Map接口特点
-
Map接口特点(JDK8的Map接口特点)
-
Map中key不可以重复,原因和HashSet一样,重复了后面添加的会覆盖前面添加的数据
-
Map中key可以为null,但只能有一个,因为后面添加的数据会覆盖前面添加的数据,value为null,可以有多个
-
key和value为一对一关系,通过key总能找到对应的value
-
常用类String类作为Map的key
-
Map与Collection并列存在。用于保存具有映射关系的数据:Key - Value
-
import java.util.HashMap;
import java.util.Map;
public class Map01 {
public static void main(String[] args) {
//创建对象,父类引用指向子类
Map map = new HashMap();
//添加数据
map.put("Jack",18);
map.put("Tom",18);
map.put("Jack",20); //覆盖map.put("Jack",18);
map.put("",20);
map.put("",25);
map.put("CiCi","");
map.put("XiXi","");
map.put(new Object(),"大山");
System.out.println(map.get("Jack"));
System.out.println(map);
}
}
/*
运行结果:
20
{=25, Tom=18, XiXi=, java.lang.Object@1b6d3586=大山, Jack=20, CiCi=}
*/
-
Map存放数据的key - value示意图,一对k-v是放在一个Node的,有因为Node实现了Entry接口,有些书上也说 一堆k-v就是一个Entry
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
public class MapSource {
public static void main(String[] args) {
//创建对象,父类引用指向子类
Map map = new HashMap();
//添加数据
map.put("Jack",18);
map.put("Tom",18);
map.put(new Car(),new Person());
//1.K-V 最后是HashMap$Node node = newNode(hash, key, value, null)
//2.K-V 为了方便程序员的遍历,还会常见EntrySet 集合,该集合存放的元素的类型 Entry,而一个Entry
// 对象就有K,V EntrySet<Entry> 即: transient Set<Map.Entry<K,V>> entrySet;
//3.entrySet 中,定义的类型是Map.Entry,但是实际上存放的还是 HashMap$Node
// 这时因为static class Node<K,V> implements Map.Entry<K,V>
//4.当把 HashMap$Node 对象 存放到 entrySet 就方便我们的比哪里,因为 Map.Entry 提供了重要的方法
// K getKey(); V getValue();
Set set = map.entrySet();
System.out.println(set.getClass());
for (Object o : set) {
System.out.println(o.getClass());
//向下转型
Map.Entry entry = (Map.Entry) o;
System.out.println(entry.getClass());
System.out.println(entry.getKey()+ " - "+entry.getValue());
}
//获取Key
Set set1 = map.keySet();
System.out.println(set1);
//获取Value
Collection values = map.values();
System.out.println(values);
}
}
class Car{
}
class Person{
}
/*
运行结果:
class java.util.HashMap$EntrySet
class java.util.HashMap$Node
class java.util.HashMap$Node
Tom - 18
class java.util.HashMap$Node
class java.util.HashMap$Node
com.yu.Map.Car@1b6d3586 - com.yu.Map.Person@4554617c
class java.util.HashMap$Node
class java.util.HashMap$Node
Jack - 18
[Tom, com.yu.Map.Car@1b6d3586, Jack]
[18, com.yu.Map.Person@4554617c, 18]
*/
Map接口方法
-
Map体系图
import java.util.HashMap;
public class MapMethod {
public static void main(String[] args) {
HashMap hashMap = new HashMap();
//put 添加
hashMap.put("Jack","18");
hashMap.put("Tom","20");
hashMap.put("CiCi","19");
hashMap.put("XiXi","21");
System.out.println(hashMap);
//remove 根据键删除映射关系
hashMap.remove("Jack");
System.out.println(hashMap);
//get 根据键获取值
System.out.println(hashMap.get("Tom"));
//size 获取元素的个数
System.out.println(hashMap.size());
//isEmpty 判断个数是否为零
System.out.println(hashMap.isEmpty());
//containsKey 查找键是否存在
System.out.println(hashMap.containsKey("CiCi"));
//clear 清空
hashMap.clear();
System.out.println(hashMap);
}
}
/*
运行结果:
{Tom=20, XiXi=21, Jack=18, CiCi=19}
{Tom=20, XiXi=21, CiCi=19}
20
3
false
true
{}
*/