码迷,mamicode.com
首页 > 编程语言 > 详细

黑马程序员——Java基础---集合(二)------Map集合

时间:2015-08-10 01:43:11      阅读:147      评论:0      收藏:0      [点我收藏+]

标签:

------<a href="http://www.itheima.com" target="blank">Java培训、Android培训、iOS培训、.Net培训</a>、期待与您交流! ------- 

                         Map集合

一、概述

1、简述:

        Map<K,V>集合是一个接口,和List集合及Set集合不同的是,它是双列集合,并且可以给对象加上名字,即键(Key)

2、特点:

        1)该集合存储键值对,一对一对往里存

        2)要保证键的唯一性。

 

二、Map集合的子类

        Map

            |--Hashtable:底层是哈希表数据结构,不可以存入null键null值。该集合是线程同步的。JDK1.0,效率低。

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

            |--TreeMap:底层是二叉树数据结构。线程不同步。可以用于给Map集合中的键进行排序。

        Map和Set很像。其实Set底层就是使用了Map集合。

 

三、Map集合的常用方法

1、添加

        Vput(K key,V value);//添加元素,如果出现添加时,相同的键,那么后添加的值会覆盖原有键对应值,并put方法会返回被覆盖的值。

        voidputAll(Map <? extends K,? extends V> m);//添加一个集合

2、删除

        clear();//清空

        Vremove(Object key);//删除指定键值对

3、判断

        containsKey(Objectkey);//判断键是否存在

        containsValue(Objectvalue)//判断值是否存在

        isEmpty();//判断是否为空

4、获取

        Vget(Object key);//通过键获取对应的值

        size();//获取集合的长度

        Collection<V>value();//获取Map集合中所以得值,返回一个Collection集合

还有两个取出方法,接下来会逐个讲解:

        Set<Map.Entry<K,V>>entrySet();

        Set<K>  keySet();

注:HashMap集合可以通过get()方法的返回值来判断一个键是否存在,通过返回null来判断。

 建立学生类:

 

四、Map集合的两种取出方式

        

 1 /*
 2 map集合的两种取出方式:
 3 1    Set<k> keySet: 将map中所有的键存入到Set集合。因为set具备迭代器。
 4         所有可以迭代方式取出所有的键,在根据get方法。获取每一个键对应的值
 5 
 6         Map集合的取出原理: 将map集合转成set集合
 7 
 8 2    Set<Map.Entry<k,v>> entrySet:将map集合中的映射关系存入到了set集合中,
 9                             而这个关系的数据类型就是:Map.Entry
10 
11                             Entry其实就是Map中的一个static内部接口
12                             为什么要定义在内部类呢?
13                             因为只有有了Map集合,有了键值对,才会有键值的映射关系
14                             关系属于Map集合中的一个内部事物
15                             而且该事物在直接访问Map集合中的元素
16 */
17 import java.util.*;
18 class MapDemo2
19 {
20     public static void main(String[] args)
21     {
22         Map<String,String>map=new HashMap<String,String>();
23         map.put("02","zhangsan2");
24         map.put("03","zhangsan3");
25         map.put("01","zhangsan1");
26         map.put("04","zhangsan4");
27 
28         /*将Map集合中的映射关系取出。存入到Set集合中
29         Set<Map.Entry<String,String>> entrySet=map.entrySet();
30         Iterator<Map.Entry<String,String>>it=entrySet.iterator();
31         while(it.hasNext())
32         {
33             Map.Entry<String,String> me=it.next();
34             String key=me.getKey();//通过映射关系取出键
35             String value=me.getValue();//通过映射关系取出值
36             System.out.println(key+":"+value);
37         }
38         */
39         //先获取map集合的所有键的Set集合,keySet();
40         Set<String> qq = map.keySet();
41 
42         //有了Set集合。就可以获取其迭代器。
43         Iterator<String> it = qq.iterator();
44 
45         while(it.hasNext())
46         {
47             String key = it.next();
48             //有了键可以通过map集合的get方法获取其对应的值。
49             String value  = map.get(key);
50             System.out.println("key:"+key+",value:"+value);
51         }
52     }
53 }

关于Map.Entry:

        Map是一个接口,其实,Entry也是一个接口,它是Map的子接口中的一个内部接口,就相当于是类中有内部类一样。为何要定义在其内部呢?

        原因:a、Map集合中村的是映射关系这样的两个数据,是先有Map这个集合,才可有映射关系的存在,而且此类关系是集合的内部事务。

                     b、并且这个映射关系可以直接访问Map集合中的内部成员,所以定义在内部。

五、Map集合的应用及扩展

1、何时使用Map集合:当量数据之间存在着映射关系的时候,就应该想到使用Map集合。

2、示例:

        获取该字符串中的字母出现的次数,如:"sjokafjoilnvoaxllvkasjdfns";希望打印的结果是:a(3)c(0).....

        通过结果发现,每个字母都有对应的次数,说明字母和次数之间有映射关系。代码如下:

示例2:

 1 /*练习
 2 "sdfgzxcvasdfxcvdf"获取该字符串中的字母出现的次数。
 3 希望打印结果:a(1)c(2).....
 4 
 5 通过结果发现,每一个字母都有对应的次数。
 6 说明字母和次数之间都有映射关系。
 7 
 8 注意了,当发现有映射关系时,可以选择map集合。
 9 因为map集合中存放就是映射关系。
10 
11 
12 什么时候使用map集合呢?
13 当数据之间存在着映射关系时,就要先想map集合
14 
15 思路:
16 1    将字符 串转换成字符数组。因为要对每一个字母进行操作
17 
18 2    定义一个map集合,因为打印结果的字母有顺序,所以使用treemap集合。
19 3    遍历字符数组
20             将每一个字母作为键去查map集合
21             如果返回null,将该字母和1存入到map集合中
22             如果返回不是null,说明该字母在map集合已经存在并有对应的次数
23             那么就获取该次数并进行自增,然后将该字母和自增后的次数存入
24 4    将Map集合中的数据变成指定的字符串形式返回。
25 */
26 import java.util.*;
27 class MapTest3
28 {
29     public static void main(String[] args)
30     {String s="ak+abAf1c,dCkaAbc-defa";
31     System.out.println(s);
32     String s1= charCount("ak+abAf1c,dCkaAbc-defa");
33     System.out.println(s1);
34     }
35 
36     public  static String charCount(String s)
37     {
38         char[] chs=s.toCharArray();
39         TreeMap<Character,Integer>  tm=new TreeMap<Character,Integer>();//创建容器限定存入类型
40         
41         int count =0;
42         for(int x=0;x<chs.length;x++)
43         {
44             if(!((‘a‘<=chs[x]&&chs[x]<=‘z‘)||(‘A‘<=chs[x]&&chs[x]<=‘Z‘)))//去除非字母元素
45                 continue;
46             Integer value=tm.get(chs[x]);//通过键获取值
47             if(value!=null)//如果该值不为空
48                 count=value;
49             count++;
50             tm.put(chs[x],count);//直接往集合中存储字符和数字,为什么可以?因为自动装箱
51 
52             count=0;
53 
54         }
55         StringBuilder sb=new StringBuilder();//建立字符串缓冲区
56         Set<Map.Entry<Character,Integer>> entrySet=tm.entrySet();//建立映射关系的集合
57         Iterator<Map.Entry<Character,Integer>>it=entrySet.iterator();//调用集合中的迭代器
58 
59         while(it.hasNext())
60         {
61             Map.Entry<Character,Integer>me=it.next();//将映射关系存入 me  中
62             Character ch=me.getKey();
63             Integer value=me.getValue();
64             sb.append(ch+"("+value+")");//字符串容器添加元素
65         }
66         return sb.toString();//转成字符串
67     }
68 }

六、Map扩展知识

        在很多项目中,应用比较多的是一对多的映射关系,这就可以通过嵌套的形式将多个映射定义到一个大的集合中,并将大的集合分级处理,形成一个体系。

 1 /*
 2 map扩展知识
 3 map集合被使用是因为具备映射关系
 4 
 5 "yureban"   Student("01" "zhangsan");
 6 
 7 "yureban" Student("02" "lisi");
 8 
 9 "jiuyeban" "01" "wangwu";
10 "jiuyeban" "02" "zhaoliu";
11 一个学校有多个教师,每一个教师都有名称。
12 */
13 import java.util.*;
14 class Student//构建学生对象
15 {
16     private String id;
17     private String name;
18     Student(String id,String name)
19     {
20         this.id=id;
21         this.name=name;
22     }
23     public String toString()
24     {
25         return id+"::"+name;
26     }
27 }
28 class lianxi2
29 {
30     public static void main(String[] args) 
31     {
32     
33         HashMap<String,String>  yure = new HashMap<String,String>();//建立HashMap集合
34             yure.put("01","zhagnsan");//添加元素
35             yure.put("02","lisi");
36         HashMap<String,String> jiuye = new HashMap<String,String>();
37             jiuye.put("01","zhaoliu");
38             jiuye.put("02","wangwu");
39 
40         HashMap<String,HashMap<String,String>> czbk = new HashMap<String,HashMap<String,String>>();
41             czbk.put("yureban",yure);//集合中存在集合
42             czbk.put("jiuyeban",jiuye);
43 
44         //遍历czbk集合。获取所有的教室。
45         Iterator<String> it = czbk.keySet().iterator();
46 
47         while(it.hasNext())
48         {
49             String roomName = it.next();
50             HashMap<String,String> room = czbk.get(roomName);
51         //    
52             System.out.println(roomName);//输出教室名称
53             getStudentInfo(room);//遍历教室,获取学生信息
54         }
55 
56         
57     //getStudentInfo(jiuye);
58     //getStudentInfo(yure);
59 
60         
61     }
62     public static void getStudentInfo(HashMap<String,String> roomMap)
63     {
64         Iterator<String> it = roomMap.keySet().iterator();//调用roomMap集合中的迭代器
65 
66         while(it.hasNext())//遍历  教室中的学生名称
67         {
68             String id = it.next();
69             String name = roomMap.get(id);
70             System.out.println(id+":"+name);
71         }
72     }
73 }

自我总结:

  Map集合的特殊之处,便是键值对的成对出现,不仅可以通过键获取值,更可以通过二者的关系获取键和值。提供了一对多的环境。而通过循环的嵌套,可以形成金字塔状的网,这也对应着现实中很多存在,例如一个公司有很多部门,而一个部门对应很多员工一般。Map集合在生活中有很大的应用,例如工人拿计件工资时,便更是如此,每个人都有对应的件数,而且不能乱。Map集合便可以很好的体现这一点。

黑马程序员——Java基础---集合(二)------Map集合

标签:

原文地址:http://www.cnblogs.com/ktlshy/p/4716759.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!