一、Map特点
Map<K,V>
双列集合,存储的是键值对,必须保持键的唯一性。一个映射不能包含重复的键;每个键最多只能映射到一个值。(比如,一对夫妻Map<K,V>
集合,中间的映射关系就是结婚证entrySet)。
二、Map常用方法
1、添加:
v put(key, value):返回前一个和key关联的值,如果没有返回null。
2、删除:
void clear() :清空map集合。
v remove(key) :根据指定的key删除这个键值对,并返回该key的键值。
3、判断
boolean containsKey(key)
boolean containsValue(value)
boolean isEmpty()
4、获取
v get(key):返回指定key的值,如果没有键值,则返回值。
int size():获取键值对的个数。
三、Map获取按键和键值的两种方法
1、KeySet:首先利用KeySet方法获取所有按键集合Set,然后利用迭代器和get方法获取所有键值。
HashMap<Integer,String> m = new HashMap<>();
m.put(1,"aaa1");
m.put(3,"aaa3");
m.put(2,"aaa2");
m.put(4,"aaa4");
Set<Integer> keyset = m.keySet();//获取所有按键
Iterator<Integer> it = keyset.iterator();
while(it.hasNext()){
System.out.println(m.get(it.next()));//获取键值
}
2、entrySet的运用:取出映射关系和所有按键和键值。
HashMap<Integer,String> m = new HashMap<>();
m.put(1,"aaa1");
m.put(3,"aaa3");
m.put(2,"aaa2");
m.put(4,"aaa4");
/*返回值是映射关系对象的集合(结婚证类型)*/
Set<Map.Entry<Integer,String>> me = m.entrySet();
Iterator<Map.Entry<Integer,String>> it = me.iterator();
while(it.hasNext()){
/*mevalue是结婚证类型的对象*/
Map.Entry<Integer,String> mevalue = it.next();
/*结婚证类型的对象调用方法*/
Integer k = mevalue.getKey();
String v = mevalue.getValue();
System.out.println(k+"::"+v);
}
说明:Set<Map.Entry<K,V>> entrySet();
返回的是一个映射关系的集合。Map.Entry是一个接口类型,有自己的方法,当具体实现这个接口时,就会建立相应的对象,来调用方法。
四、Map常用子类
1、Hashtable:内部是哈希表,同步,不能空键、空值。(其中有个子类Properties,后面结合IO接口,配置文件信息。)
2、HashMap:内部是哈希表,不同步,可以空键、空值。(LinkedHashMap是有序的,怎么存,怎么取)
3、TreeMap:内部是二叉树,不同步,可以对key进行排序。
4、例子—-具体实现
/*按键是Person对象,键值是字符串对象*/
HashMap<Person, String> hm = new HashMap<>();
hm.put(new Person("xx1", 11), "上海");
hm.put(new Person("xx3", 13), "广州");
hm.put(new Person("xx6", 16), "南京");
hm.put(new Person("xx5", 15), "北京");
hm.put(new Person("xx1", 11), "临沂");
//自定义哈希算法判断key相等,key相等可以覆盖键值,符合Map集合特点。
/*迭代器注意集合内的存储的对象类型*/
Iterator<Person> it = hm.keySet().iterator();
while (it.hasNext()) {
Person p = it.next();
System.out.println(p.getName() + ":" + p.getAge() + ":" + hm.get(p));
}