代码改变世界

黑马程序员-Map集合

2014-06-06 17:12  黑马程序员*  阅读(189)  评论(0编辑  收藏  举报

Map总结:tree排序,hsah保证唯一性

Map集合特点:该集合存储键值对,一对一对往里存,而且要保证键的唯一性。

Map和Set很像,Set底层就是使用了Map集合。Map没有迭代器,要靠keySet和entrySet方法返回Set,在用迭代器。

Map

       |--Hashtable:底层是哈希表数据结构,不可以存入键和值为Null.此实现是同步的。jdk1.0,效率低。------       |--Properties:用来存储键值对型的配置文件的信息,可以和IO技术相结合。       

                            为了成功地在哈希表中存储和获取对象,用作键的对象必须实现 hashCode 方法和 equals 方法。

       |--HashMap:底层是哈希表数据结构,允许使用null值和null键,该集合是不同步的。jdk1.2,效率高

                            看到hash:就要想到哈希表,就要想到唯一性,就要想到元素需要覆盖hashcode方法和equals方法

       |--TreeMap:底层是二叉树数据结构,线程不同步,允许使用null值和null键。

                            可以用于给Map集合中的键进行排序(就要想到二叉树,就要想要排序,就要想到两个接口Comparable,Comparator)。

常用方法:

       添加:

              v   put(k ,v)//注意;键相同时,put方法返回原来的键映射的值

              void putAll(Map); 将Map中的所有映射关系存入,不是以集合的形式存入。

              --|    Map<String,String> map = new HashMap<String,String>();

                     Map<String,Integer> map1 = new HashMap<String,Integer>();

                     Map<String,String> map2 = new HashMap<String,String>();

                     map.putAll(map1);//报错,因为map不接受Integer类型

                     map.putAll(map2);

              注:put方法,键相同时,后添加的键覆盖原来的键,并且返回原来的键映射的值

       删除 :

              void   clear() 从此映射中删除所有映射关系

              V(value)  remove(Object ,key)如果存在一个键的映射关系,则将其从此映射中

                              删除对应键和值,并返回对应的值。不存在返回null

                              --|map.put("lisi","22");

                                   System.out.println(map.remove("lisi"));//返回22

       判断:boolean      

                     containsKey(Object key) 如果此映射包含键的映射关系,则返回true

                     containsValue(value) 如果此映射值对应一个或多个键,则返回true

                     is Empty()如果此映射未包含键-值映射关系,则返回 true。

                     get(key)返回指定键所映射的值。同样可以判断

       获取:

                     get( Object,key)返回指定键所映射的值。

                     Set  keySet() 返回此映射中所包含的键(全部)

                     Set<Map.Entry<K,V>>   entrySet() 返回此映射中包含的全部映射关系。

                     size() 获取此映射中的键-值关系数。//几对

                     Colection vaules()返回此映射中包含的全部值,与ketSet正好相反。注意返回值。

 

Map集合的两种取出方式:

              Map集合取出的原理:将Map集合转成Set集合,在通过迭代器取出。

              1.keyset:返回值类型:Set集合  功能:返回此映射中所包含的键(全部)

                             思路: 将Map中所有的键存入到Set集合中,因为Set具备迭代器。

                             所以可以迭代方式取出所有的键,再根据get方法,获取每一个键对应的值。

              Set<Integer> keyset = map.keySet();          

              Iterator<Integer> it = keyset.iterator();

              while (it.hasNext()){

                     Integer num = it.next();

                     System.out.println("ker:"+num+"..."+"value:"+map.get(num));

              2.entrySet:返回值类型:Set  功能:将Map集合的映射关系存入到Set集合中。

                                   而这个关系的数据类型就是:(Map.Entry<k,v>)

 

              Set<Map.Entry<Integer,String>> entryset = map.entrySet();

              Iterator<Map.Entry<Integer,String>> it = entryset.iterator();

              while (it.hasNext()){

                     Map.Entry<Integer,String> ma = it.next();

                     Integer key = ma.getKey();

                     String value = ma.getValue();

                     System.out.println("key:"+key+"   "+"value:"+value);

              }

              //高级for      

              for(Map.Entry<String, String> m:entryset){

                     System.out.println("..."+m);

              }

              Map.Entry :映射项(键-值对)

              其实Entry也是一个接口。它是Map接口中一个内部接口。

              Map的子类如hashMap在创建的时候用静态内部类实现了Entry.

              为什么要定义在内部:1.Map集合先于它存在,它是Map内部的一部分。

                                   2.直接访问Map,所以定义成内部。

              练习1;

              每一个学生都有对应的归属地 当作值,学生属性:姓名年龄当作键,

              注意;姓名和年龄相同的视为同一个学生。    保证学生的唯一性。

              思路:

              1.描述学生

              2.定义map容器,将学生做为键,归属地做为值,存入。

              3.获取map集合的元素。

4.因为不知道定义的对象要放在何种集合中,所以要事先compareble,覆盖hashcode和equals

              练习2

              需求:对学生的年龄进行升序排序。

              因为数据是以键值对形式存在。

              所以要使用可以排序的Map集合。TreeMap

              练习4:

              "dfdfegfeghhg"获取该字符串中的字母出现的次数。

              希望打印结果:a(1)c(3).....

              思路:通过结果发现,每一个字母都有对应的系数。

                       说明字母和次数之间都有映射关系

                       1.将字符转换成数组,因为要对每一个字符进行操作。

                       2.定义一个Map集合,因为打印的字母有顺序,使用TreeMap集合。

                       3.便利字符数组。

                          将每一个字母作为键去查map集合。

                            如果返回null,将字母和1存入map中。

                            如果返回不是null,说明字母在map集合已经存在并有对应的次数。

                            那么就获取该次数并自增,然后将字母和自增后的次数存入。

                       4.将map集合中的数据变成指定的字符串形式返回。

              练习4:

              扩展 Map扩展,

                      --教室1(学生.......)

              学校 --教室2(学生.......)

                      --教室3(学生.......)