天天看点

黑马程序员java笔记之一-----Map集合

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

            1.  添加:

                put(k key,v value)

                putAll(Map<? extends k,?extends v>m)  从指定映射中将所有映射关系复制到此映射中(可选操作)。

            2.  删除

                 clear()

                 remove(Object key)

            3. 判断

                 containsValue(Object value)

                 containKey(Object key)

                 isEmpty()

            4.获取

                 get(Object key)

                 size()

                 value()  从指定映射中将所有映射关系复制到此映射中(可选操作)。

                Map

                 |---Hashtable

                                 此类实现一个哈希表,该哈希表将映射到相应的值。不可以存入null值和null键。jdk1.0,效率高

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

                                   从Java 2 平台 v1.2起,此类就被改进以实现<code>Map</code> 接口,使它成为 Java Collections Framework

                                 中的一个成员。不像新的 collection 实现,<code>Hashtable</code> 是同步的,底层是哈希表数据结构。

                  |---HashMap 底层表示哈希表数据结构,允许使用null值和null值,该集合是不同步的。

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

                               和set比较:Set底层就是使用了Map集合。

[java] view plaincopy

&lt;span style="font-size:18px;"&gt;import java.io.ObjectOutputStream.PutField;  

import java.util.Collection;  

import java.util.HashMap;  

import java.util.Map;  

public class MapTest {  

    public static void main(String[] args){  

        Map&lt;String, String&gt; map=new HashMap&lt;String, String&gt;();  

        //添加元素,如果出现相同的键,那么后添加的值会覆盖原有键对应值,并put方法会返回被覆盖的值。  

        System.out.println("map:"+map.put("01", "zhang"));  

        System.out.println("map:"+map.put("01", "wsufn"));  

        map.put("02", "li");  

        map.put("03", "sun");  

        map.put(null, "hehe");  

        map.put(null, null);//  

        map.put(null,"woish");  

        map.put("04", null);  

        map.put("05", null);//只允许存在一个null键,可以存在一个或多个null值  

        System.out.println(map.containsKey("01"));  

        System.out.println("get:"+map.get("03"));  

        //可以通过get方法的返回值来判断一个键是否存在  

        System.out.println(map);  

        Collection&lt;String&gt; coll=map.values();  

        // Collection&lt;V&gt; values() 返回此映射所包含的值的 Collection 视图。  

        System.out.println(coll);  

    }  

}&lt;/span&gt;  

map集合的两种取出方式:

       一、Set&lt;k&gt; keySet:将map中所有的键存入到Set集合。因为set具备迭代器。

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

&lt;span style="font-size:18px;"&gt;  Map集合的取出原理:将map集合转成set集合。再通过迭代器取出。  

       public class MapTest {  

           public static void main(String[] args){  

               Map&lt;String, String&gt; map=new HashMap&lt;String, String&gt;();  

               map.put("02", "li");  

               map.put("03", "sun");  

              Set&lt;String&gt; keyset= map.keySet();  

               // Collection&lt;V&gt; values() 返回此映射所包含的值的 Collection 视图。  

             //有了Set集合,就可以获取迭代器  

              Iterator&lt;String&gt; it=keyset.iterator();  

             while (it.hasNext()) {  

              String str =(String)it.next();  

               String value=map.get(str);//得到key对应的值  

              System.out.println("key:"+str);//得到值,而没有得到键  

              }  

  }  

二、Set&lt;Map.Entry&lt;k,v&gt;&gt; entrySet: 将map集合中的映射关系取出,存入到集合中

     public class MapTest {  

        public static void main(String[] args){  

        Set&lt;Map.Entry&lt;String, String&gt;&gt; entry=map.entrySet();  

        Iterator&lt;Map.Entry&lt;String,String&gt;&gt; it=entry.iterator();  

        while (it.hasNext()) {  

        Map.Entry&lt;String, String&gt;  me=it.next();  

        String key= me.getKey();  

        String value=me.getValue();  

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

           }  

}  

注明:Map.Entry()其实Entry也是一个接口,它是Map接口中的一个内部接口。

练习:

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

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

&lt;span style="font-size:18px;"&gt;import java.util.*;  

class A implements Comparator&lt;Student&gt;  

{  

    public int compare(Student s1,Student s2)  

    {  

        int num = s1.getName().compareTo(s2.getName());  

        if(num==0)  

            return new Integer(s1.getAge()).compareTo(new Integer(s2.getAge()));  

            return num;  

class  MapTest  

    public static void main(String[] args)  

        TreeMap&lt;Student,String&gt; tm = new TreeMap&lt;Student,String&gt;(new StuNameComparator());  

         map.put("02", "li");  

         map.put("03", "sun");  

//   第一种方法:keySet  

             Set&lt;Student&gt; keySet=tm.keySet();  

             Iterator&lt;String &gt; it=keyset.iterator();  

        while(it.hasNext()){  

        Student stu=it.next();  

        String addr=tm.get(stu);  

        System.out.println(stu+".."+addr);  

            }  

//   第二种方法: entrySet:  

        Set&lt;Map.Entry&lt;Student,String&gt;&gt; entrySet = tm.entrySet();  

        Iterator&lt;Map.Entry&lt;Student,String&gt;&gt; it = entrySet.iterator();  

        while(it.hasNext())  

        {  

            Map.Entry&lt;Student,String&gt; me = it.next();  

            Student stu = me.getKey();  

            String addr = me.getValue();  

            System.out.println(stu+":::"+addr);  

        }  

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

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

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

注意,当发现有映射关系时,可以选择map集合。因为map集合中存放就是映射关系。

什么使用map集合呢?

当数据之间存在这映射关系时,就要先想map集合。

思路:

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

2,定义一个map集合,因为打印结果的字母有顺序,所以使用treemap集合。

3,遍历字符数组。

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

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

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

    那么就获取该次数并进行自增。,然后将该字母和自增后的次数存入到map集合中。覆盖调用原理键所对应的值。

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

&lt;span style="font-size:18px;"&gt;class  MapTest  

    public static void main(String[] args)   

        String s= charCount("wefsdfefdc,sedffe-fsd");  

        System.out.println(s);  

    public static String charCount(String str)  

        char[] chs = str.toCharArray();  

        TreeMap&lt;Character,Integer&gt; tm = new TreeMap&lt;Character,Integer&gt;();  

        int count = 0;  

        for(int x=0; x&lt;chs.length; x++)  

                     if(!(chs[x]&gt;='a' &amp;&amp; chs[x]&lt;='z' || chs[x]&gt;='A' &amp;&amp; chs[x]&lt;='Z'))  

              continue;  

                    Integer value = tm.get(chs[x]);  

            if(value!=null)  

            count = value;  

            count++;  

            tm.put(chs[x],count);//直接往集合中存储字符和数字,因为自动装箱。  

            count = 0;  

            /* 

            if(value==null) 

            { 

                tm.put(chs[x],1); 

            } 

            else 

                value = value + 1; 

                tm.put(chs[x],value); 

            */  

 }  

                StringBuilder sb = new StringBuilder();  

                Set&lt;Map.Entry&lt;Character,Integer&gt;&gt; entrySet = tm.entrySet();  

        Iterator&lt;Map.Entry&lt;Character,Integer&gt;&gt;  it = entrySet.iterator();  

                while(it.hasNext())  

            Map.Entry&lt;Character,Integer&gt; me = it.next();  

            Character ch = me.getKey();  

            Integer value = me.getValue();  

            sb.append(ch+"("+value+")");  

        return sb.toString();