| 第四节  Map 集合 一、概述:
 1、简述:
 Map<K,V>集合是一个接口,和List集合及Set集合不同的是,它是双列集合,并且可以给对象加上名字,即键(Key)
 2、特点:
 1)该集合存储键值对,一对一对往里存
 2)要保证键的唯一性。
 二、方法简介:
 Map集合中的方法和上面集合的方法是很相似的,这里不一一都具体说明了,用示例的形式体现一下:
 1、添加:      添加单个元素:put(k key,V value); 添加一个集合:putAll(Map<? extends K,? extends V> m)
 2、删除:      获取并移除:remove(Object key); 清空集合中元素:clear (Object key)
 3、判断:      判断集合是否为空: isEmpty()  ; 键对应的值是否存在:containsKey(Object key); 值对应的键是否存在:containsValue(Object obj)  ---->     返回boolean类型
 4、获取:      获取单个元素:get(Object key); 获取长度:size();    获取Map集合中的所有值(value),返回Conllection集合。
 注:
 a.也可以通过get()方法的返回值来判断一个键是否存在,通过返回null来判断。
 b.其中put方法:如果出现添加相同的键,那么后添加的值会覆盖原有键对应的值,并且该方法返回被覆盖的值即原值。
 示例:
 [java] view plaincopyprint?
 <span style="font-family: Arial; font-size: 10px; ">/*
 Map集合方法
 */
 import java.util.*;
 class MapDemo
 {
 public static void sop(Object obj)
 {
 System.out.println(obj);
 }
 public static void main(String[] args)
 {
 //创建Map集合,并添加元素
 Map<Integer,String> map = new HashMap<Integer,String>();
 map.put(1,"zhangsan");
 map.put(2,"lisi");
 map.put(3,"wangwu");
 map.put(4,"heihei");
 map.put(5,"xixi");
 //获取长度
 int n = map.size();
 //打印元素
 sop("原集合:" + map + "\n长度为:" + n);
 sop("---------------------------------------");
 //创建新集合,并添加元素
 Map<Integer,String> m = new HashMap<Integer,String>();
 m.put(7,"zann");
 m.put(9,"hewi");
 m.put(13,"wangfei");
 m.put(14,"huxi");
 m.put(10,"anch");
 //用putAll将元素添加到原集合中
 map.putAll(m);
 sop("putAll --新集合:" + map);
 sop("----------------------------------");
 //删除元素
 sop("remove:" + map.remove(01));
 sop("新集合:" + map);
 sop("----------------------------------");
 /*
 //清空集合中的元素
 map.clear();
 sop("新集合:" + map);
 //判断是否为空集合
 boolean be = map.isEmpty();
 sop("isEmpty ,null? :" + be);
 sop("----------------------------------");
 */
 
 //判断元素是否存在
 boolean bk = map.containsKey(01);
 boolean bv = map.containsValue("wangwu");
 sop("判断:\n01?:" + bk + "-----  wangwu?:" + bv);
 sop("----------------------------------");
 
 //获取元素:get
 String s = map.get(01);
 String s1 = map.get(02);
 //Integer i =  map.get("lisi");
 //Integer i2 = map.get("zhangsan");
 sop(map.get("lisi"));
 sop(map.get("zhangsan"));
 sop("获取元素get:01:" + s + ",02:" + s1);
 sop("-----------------------------------------------");
 //获取集合中的所有元素:Value
 Collection<String>  coll = map.values();
 sop("value--获取集合中所有元素:" + coll);
 sop("----------------------------------");
 }
 }</span>
 
 三、Map集合中的子类:
 1、HashTable:特点 -- > 底层是哈希表数据结构,不可存入null键和null值。该集合是线程同步的,效率较低
 2、HashMap:特点   -- >  底层是哈希表数据结构,允许使用null值和null键。该集合是线程同步的,效率较高
 3、TreeMap:特点     -- > 底层是二叉树数据结构,线程不同步,可以用于给Map集合中的键值进行排序,和Set很像,其实,Set集合的底层就是使用了Map集合。
 
 四、两种获取集合元素的方法:
 重点说一下获取方法中的两个:keySet()和entrySet()方法
 1、keySet()方法获取元素
 原理:将Map集合中的所有键存入到Set集合中,因为Set集合具备迭代器,所以可以用迭代方式取出所有的键,再根据get方法获取每一个键对应的值。简单说就是:Map集合---->Set集合 ---->迭代器取出
 示例:
 [java] view plaincopyprint?
 <span style="font-family: Arial; font-size: 10px; ">//keySet集合测试
 
 import java.util.*;
 class KeySetDemo
 {
 public static void main(String[] args)
 {
 //创建Map集合,并添加元素
 Map<Integer,String> map = new HashMap<Integer,String>();
 map.put(2,"zhangsan");
 map.put(6,"lisi");
 map.put(3,"wangwu");
 map.put(4,"heihei");
 map.put(5,"xixi");
 //获取map集合中的所有键的Set集合
 Set<Integer> keySet = map.keySet();
 //有了Set集合就可以获取其迭代器,取值
 Iterator<Integer> it = keySet.iterator();
 while (it.hasNext())
 {
 Integer i = it.next();
 String s = map.get(i);
 System.out.println(i + " = " + s);
 }
 }
 }
 </span>
 
 2、entrySet()方法获取元素:
 原理:将Map集合中的映射关系存入到了Set集合中,而这个映射关系的数据类型是Map.Entry,在通过迭代器将映射关系存入到Map.Entry集合中,并通过其中的getKey()和getValue()放取出键值。
 示例:
 [java] view plaincopyprint?
 <span style="font-family: Arial; font-size: 10px; ">/*
 entrySet取出方式:
 */
 import java.util.*;
 class EntrySetDemo
 {
 public static void main(String[] args)
 {
 //创建集合,存入元素
 Map<String,String> map = new HashMap<String,String>();
 map.put("01","lisi1");
 map.put("02","lisi2");
 map.put("03","lisi3");
 map.put("04","lisi4");
 //获取map集合中的所有键,存入到Set集合中,
 Set<Map.Entry<String,String>> entry = map.entrySet();
 //通过迭代器取出map中的键值关系,迭代器接收的泛型参数应和Set接收的一致
 Iterator<Map.Entry<String,String>> it = entry.iterator();
 while (it.hasNext())
 {
 //将键值关系取出存入Map.Entry这个映射关系集合接口中
 Map.Entry<String,String>  me = it.next();
 //使用Map.Entry中的方法获取键和值
 String key = me.getKey();
 String value = me.getValue();
 System.out.println(key + " : " + value);
 }
 }
 }
 </span>
 
 补充:关于Map.Entry
 Map是一个接口,其实,Entry也是一个接口,它是Map的子接口中的一个内部接口,就相当于是类中有内部类一样。为何要定义在其内部呢?
 原因:a.Map集合中村的是映射关系这样的两个数据,是先有Map这个集合,才可有映射关系的存在,而且此类关系是集合的内部事务。
 b.并且这个映射关系可以直接访问Map集合中的内部成员,所以定义在内部。
 
 |