天天看點

黑馬程式員----------------java基礎-----------------Map集合



------- <a href="http://www.itheima.com" target="_blank" rel="external nofollow" target="_blank" rel="external nofollow" target="_blank" rel="external nofollow" target="_blank" rel="external nofollow" target="blank">android教育訓練</a>、<a href="http://www.itheima.com" target="_blank" rel="external nofollow" target="_blank" rel="external nofollow" target="_blank" rel="external nofollow" target="_blank" rel="external nofollow" target="blank">java教育訓練</a>、期待與您交流! ----------

第一講 map集合概述

1、将鍵映射到值的對象。一個映射不能包含重複的鍵;每個鍵最多隻能映射到一個值。

 什麼時候使用map集合呢?

 當資料之間存在這映射關系時,就要先想map集合。

2、基本方法

 2.1、put(K key, V value)

  如果出現添加相同的鍵時,那麼後添加的值會覆寫原有鍵對應值、并且put方法會傳回被覆寫的值。

  特點:保證鍵的唯一性

重要:

 向map集合中添加元素時,如果傳回的是空,說明該鍵是第一次存入。

 2.2、、删除。

  clear()

  以前與 key 關聯的值;如果沒有 key 的映射關系,則傳回 null

  并且remove方法會傳回被删除的鍵對應的值。value remove(Object key)

 2.3、判斷

  如何存在,則傳回true,否則false

  boolean containsValue(Object value)

  boolean containsKey(Object key)

  boolean isEmpty()

 2.4、擷取。

  指定鍵所映射的值;如果此映射不包含該鍵的映射關系,則傳回 null

  get(Object key) 得到鍵對應的值

  size() 得到集合長度

  entrySet() 傳回此映射中包含的映射關系的 Set 視圖。

  keySet() 傳回此映射中包含的鍵的 Set 視圖。

3、Map子類對象特點

  Hashtable:底層是哈希表資料結構,不可以存入null鍵null值。該集合 是線程同步的,必須實作hashCode和equals方法,jdk1.0,效率低。

  HashMap:底層是哈希表資料結構,允許一個null鍵和多個null值,該集合是不同步的。将hashtable替代,jdk1.2,效率高。也需要實作元素的hashCode 和equals方法。

  TreeMap:底層是二叉樹資料結構。線程不同步。可以用于給map集合中的鍵進行排序。

4、Map集合的兩種取出方式:

 4.1、keyset方式

  将map集合中所有的鍵值取出放到set集合,set集合可以利用疊代器取出每個鍵值,然後根據map集合的get方法取出每個鍵對應的值

 4.2、entrySet方式

  将map集合的一種映射關系存入set集合,這種關系就是Map.Entry。然後利用getkey()和getvalue()方法,分别取出鍵和值

說明:

 Map是一個接口,其實,Entry也是一個接口,它是Map的子接口中的一個内部接口,就相當于是類中有内部類一樣。為何要定義在其内部呢?

   原因:a、Map集合中村的是映射關系這樣的兩個資料,是先有Map這個集合,才可有映射關系的存在,而且此類關系是集合的内部事務。

         b、并且這個映射關系可以直接通路Map集合中的内部成員,是以定義在内部。

import java.util.*;

//Map集合的兩種取出方式

class  MapTest

{

 public static void main(String[] args)

 {

  Map <String,String>map=new HashMap<String,String>();//通過泛型定義要存入map集合的是字元串

  map.put("zhnagsan","20");

  map.put("wangwun","26");

  map.put("lisi","24");//向集合中添加元素

  map.put("zhnagqiang","22");

  //keyset方式練習

  Set<String > keyset=map.keySet();//用keyset方法将鍵存入set集合

  Iterator<String> it=keyset.iterator();//利用疊代器取出鍵值

  while (it.hasNext())

  {

   String key=it.next();

   String value=map.get(key);//用map的get方法取出鍵對應的值

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

  }

  //entryset方式練習

  Set<Map.Entry<String,String>> entryset=map.entrySet();//将map集合的一種映射關系存入set集合

  Iterator<Map.Entry<String,String>> newit=entryset.iterator();//利用疊代器取出鍵值

  while (newit.hasNext())

  {

   Map.Entry<String,String> me=newit.next();

   String key=me.getKey();//然後利用getkey()方法,取出鍵

   String value=me.getValue();//然後利用ggetvalue()方法,取出值

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

  }

 }

}

練習二  每一個學生都有對應的歸屬地,歸屬地用String表示,學生的屬性有姓名、年齡,姓名和年齡相同

的學生認為是同一對象。要求保證元素唯一性。

*/

//每一個學生都有對應的歸屬地,歸屬地用String表示,學生的屬性有姓名、年齡,将學生對象按年齡排序

//練習gsauythhjdiiidkoisoo擷取字母出現的次數

//希望列印的結果是h(2)i(4).....

class  MapTest

{

 public static void main(String[] args)

 {

  String str="gsauythhjdiiidkoisoo";

  String s=getcharCount(str);//調用方法

  System.out.println(s);

 }

 public static String getcharCount(String str)

 {

  TreeMap<Character,Integer>ts=new TreeMap<Character,Integer>();//定義treemap集合并甲泛型

  StringBuilder sb=new StringBuilder();

  char[]chs=str.toCharArray();//将字元數串轉換成字元數組,

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

  {

   Integer value=ts.get(chs[x]);//用map集合的get方法,傳回值

   if(value==null)

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

   else

   {

    value=value+1;

    ts.put(chs[x],value);//如果不是null,說明存在,就将字元存入,把次數增加

   }

  }

  Set<Character> keyset=ts.keySet();//用keyset方法将鍵存入set集合

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

   while (it.hasNext())//利用疊代器取出鍵值

   {

    Character key=it.next();

    Integer value1=ts.get(key);

    sb.append(key+"("+value1+")");//列印出需要格式

   }

  return sb.toString();

 }

}

第二講  Map擴充知識

 在很多項目中,應用比較多的是一對多的映射關系,這就可以通過嵌套的形式将多個映射定義到一個大的集合中,

 并将大的集合分級處理,形成一個體系。

練習:

import java.util.*; 

class  MapExpandKnow 

    public static void main(String[] args)  

   { 

       //預熱班集合 

        HashMap<String,String> yureban=new HashMap<String,String>(); 

        //就業班集合 

        HashMap<String,String> jiuyeban=new HashMap<String,String>(); 

        //學校集合 

  HashMap<String,HashMap<String,String>> czbk=new HashMap<String,HashMap<String,String>>(); 

        //學校中班級集合和名稱的映射 

       czbk.put("yureban",yureban); 

       czbk.put("jiuyueban",jiuyeban); 

//預熱班級中學号與姓名的映射 

       yureban.put("01","zhangsan"); 

        yureban.put("02","lisi"); 

        //就業班級中學号與姓名的映射 

       jiuyeban.put("01","wangwu"); 

        jiuyeban.put("02","zhouqi"); 

           //直接顯示全部學生資訊 

       getAllStudentInfo(czbk); 

   } 

    //定義一個方法擷取全部學生資訊,包括在哪個班級,叫什麼名字,學号多少 

    public static void getAllStudentInfo(HashMap<String ,HashMap<String,String>> hm) 

    { 

        for (Iterator<String> it=hm.keySet().iterator();it.hasNext() ; )//用keySet取出方式 

       { 

            String s= it.next();//班級名稱 

           System.out.println(s+":"); 

           HashMap<String,String> stu=hm.get(s);//班級集合 

           getStudentInfo(stu); 

        } 

   } 

    //擷取班級中學生的資訊,包括姓名和學号 

   public static void getStudentInfo(HashMap<String,String> hm) 

   { 

       for (Iterator<String> it=hm.keySet().iterator();it.hasNext() ; ) 

       { 

           String key=it.next();//學号 

           String value=hm.get(key);//姓名 

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

        } 

    } 

第三講 集合架構和數組工具類

1、 Collections:它的出現給集合操作提供了更多的功能。這個類不需要建立對象,内部提供的都是靜态方法。

 靜态方法:

 Collections.sort(list);//list集合進行元素的自然順序排序。

2、Collections.max(list);//傳回list中字典順序最大的元素。

3、Collections.reverseOrder();//逆向反轉排序。

4、Collections.shuffle(list);//随機對list中的元素進行位置的置換。

5、Collections和Collection有什麼差別?

重點:

Collections是個java.util下的類,是針對集合類的一個工具類,提供一系列靜态方法,

 實作對集合的查找、排序、替換、線程安全化(将非同步的集合轉換成同步的)等操作。

 Collection是個java.util下的接口,它是各種集合結構的父接口,繼承于它的接口主要有Set和List,提供了關于集合的一些操作,

 如插入、删除、判斷一個元素是否其成員、周遊等。

6、Arrays:

 用于操作數組對象的工具類,裡面都是靜态方法。

 将數組轉換成集合,有什麼好處呢?用aslist方法,将數組變成集合;

 可以通過list集合中的方法來操作數組中的元素:isEmpty()、contains、indexOf、set;

 注意(局限性):數組是固定長度,不可以使用集合對象增加或者删除等,會改變數組長度的功能方法。比如add、remove、clear。

 (會報不支援操作異常UnsupportedOperationException);

 如果數組中存儲的引用資料類型,直接作為集合的元素可以直接用集合方法操作。

 如果數組中存儲的是基本資料類型,asList會将數組實體作為集合元素存在。

7、 集合變數組:用的是Collection接口中的方法:toArray();

 如果給toArray傳遞的指定類型的資料長度小于了集合的size,那麼toArray方法,會自定再建立一個該類型的資料,長度為集合的size。

 如果傳遞的指定的類型的數組的長度大于了集合的size,那麼toArray方法,就不會建立新數組,直接使用該數組即可,

 并将集合中的元素存儲到數組中,其他為存儲元素的位置預設值null。

 是以,在傳遞指定類型數組時,最好的方式就是指定的長度和size相等的數組。

8、增強for循環:

 for語句,簡化了疊代器。

 格式:增強for循環括号裡寫兩個參數,第一個是聲明一個變量,第二個就是需要疊代的容器

9、可變參數(...):

 用到函數的參數上,當要操作的同一個類型元素個數不确定的時候,可是用這個方式,這個參數可以接受任意個數的同一類型的資料。

 和以前接收數組不一樣的是:

 以前定義數組類型,需要先建立一個數組對象,再将這個數組對象作為參數傳遞給函數。現在,直接将數組中的元素作為參數傳遞即可。

 底層其實是将這些元素進行數組的封裝,而這個封裝動作,是在底層完成的,被隐藏了。是以簡化了使用者的書寫,少了調用者定義數組的動作。

 如果在參數清單中使用了可變參數,可變參數必須定義在參數清單結尾(也就是必須是最後一個參數,否則編譯會失敗。)。

10、泛型:jdk1.5版本以後出現的一個安全機制。表現格式:<>

 好處:

 1:将運作時期的問題ClassCastException問題轉換成了編譯失敗,展現在編譯時期,程式員就可以解決問題。

 2:避免了強制轉換的麻煩。

 隻要帶有<>的類或者接口,都屬于帶有類型參數的類或者接口,在使用這些類或者接口時,必須給<>中傳遞一個具體的引用資料類型。

 泛型技術:其實應用在編譯時期,是給編譯器使用的技術,到了運作時期,泛型就不存在了。為什麼?

 因為泛型的擦除:也就是說,編輯器檢查了泛型的類型正确後,在生成的類檔案中是沒有泛型的。

import java.util.*;

class  CollectionsDemo

{

 public static void main(String[] args)

 {

  sortDemo();

 }

 //定義一個沒有比較器的折半查找方法

 public static int halfSearch(List<String> list,String key)

 {

  //定義變量

  int max,min,mid;

  max = list.size()-1;

  min = 0;

  while(min<=max)

  {

   mid = (max+min)>>1;

   //得到中間的值

   String str = list.get(mid);

   //調用compareTo方法與關鍵值比較

   int num = str.compareTo(key);

   if(num>0)

    max = mid -1;

   else if(num<0)

    min = mid + 1;

   else

    return mid;

  }

  return -min-1;

 }

 //定義帶有比較器的折半方法

 public static int halfSearch(List<String> list,String key,Comparator<String> cmp)

 {

  int max,min,mid;

  max = list.size()-1;

  min = 0;

  while(min<=max)

  {

   mid = (max+min)>>1;//  /2;

   String str = list.get(mid);

   //調用compare方法與關鍵值比較

   int num = cmp.compare(str,key);

   if(num>0)

    max = mid -1;

   else if(num<0)

    min = mid + 1;

   else

    return mid;

  }

  return -min-1;

 }

 public static void maxDemo()

 {

  List<String> list = new ArrayList<String>();

  list.add("abcd");

  list.add("aaa");

  //用集合工具的sort方法進行排序

  Collections.sort(list);

  sop(list);

  //用集合工具的max方法求出最大值

  String max = Collections.max(list);

  sop("max="+max);

 }

 public static void sortDemo()

 {

  List<String> list = new ArrayList<String>();

  list.add("abcd");

  list.add("aaa");

  list.add("zz");

  //用集合工具的sort方法進行排序

  sop(list);

  //Collections.sort(list);

  Collections.sort(list,new StrLenComparator());

  //Collections.swap(list,1,2);

  sop(list);

 }

 public static void sop(Object obj)

 {

  System.out.println(obj);

 }

}

class StrLenComparator implements Comparator<String>

{

 public int compare(String s1,String s2)

 {

  if(s1.length()>s2.length())

   return 1;

  if(s1.length()<s2.length())

   return -1;

  return s1.compareTo(s2);

 }

}

------- <a href="http://www.itheima.com" target="_blank" rel="external nofollow" target="_blank" rel="external nofollow" target="_blank" rel="external nofollow" target="_blank" rel="external nofollow" target="blank">android教育訓練</a>、<a href="http://www.itheima.com" target="_blank" rel="external nofollow" target="_blank" rel="external nofollow" target="_blank" rel="external nofollow" target="_blank" rel="external nofollow" target="blank">java教育訓練</a>、期待與您交流! ----------

繼續閱讀