天天看點

黑馬程式員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();