1. 程式人生 > >Java集合框架15:Map集合

Java集合框架15:Map集合

Map介紹

1、將值對映到值的物件。
2、一個對映不能包含重複的鍵。
3、每個鍵最多隻能對映到一個值。

Map介面和Collection介面的不同

1、Map是雙列的,Collection是單列的。
2、Map的鍵唯一,Collection的子體系Set是唯一的。
3、Map集合的資料結構值針對鍵有效,跟值無關;Collection集合的資料結構是針對元素有效。

Map介面定義的方法

1、void clear():刪除該Map物件中的所有key-value對。
2、boolean containsKey(Object key):查詢Map中是否包含指定的key,如果包含返回true。
3、boolean containsValue(Object value):查詢Map中是否包含一個或多個value,如果包含則返回true。
4、Set entrySet():返回Map中包含的key-value對所組成的Set集合,每個集合元素都是Map.Entry物件。
5、Object get(Object key):返回指定key所對應的value;如果此Map中不包含該key,則返回null。
6、boolean isEmpty():查詢該Map是否為空,如果為空則返回true。
7、Set keySet():返回該Map中所有key組成的Set集合。
8、Object put(Object key,Object value):新增一個key-value對,如果當前Map中已有一個與該key相等的key-value對,則新的key-value對會覆蓋原來的key-value對。
9、void putAll(Map m):將指定Map中的key-value對複製到本Map中。
10、Object remove(Object key):刪除指定key所對應的key-value對,返回被刪除key所關聯的value,如果該key不存在,則返回null。
11、boolean remove(Object key,Object value):這是Java8新增的方法,刪除指定key、value所對應的key-value對。刪除成功返回true,否則返回false。
12、int size():返回該Map裡的key-value對的個數。
13、Collection values():返回該Map裡所有value組成的Collection。

package map;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
public class Dmeo1_Map {
     /**
      * A:Map集合的功能概述
      * a:新增功能
      *        V put(K key,V value):新增元素
      *            如果鍵是第一次儲存,就直接儲存元素,返回null
      *             如果鍵不是第一次存在,就用值把以前的值替換掉,返回以前的值
      * b:刪除功能
      *        void clear() :移除所有的鍵值對元素
      *        V remove(Object key):根據鍵刪除鍵值對元素,並把值返回
      * c:判斷功能
      *        boolean containsKey(Object key):判斷集合是否包含指定的鍵
      *        boolean containsValue(Object value):判斷集合是否包含指定的值
      *        boolean isEmpty():判斷集合是否為空
      * d:獲取功能
      *        Set<Map.Entry<K,V> entrySet();
      *        V get(Object key):根據鍵獲取值
      *        Set<K> keySet():獲取集合中所有鍵的集合
      *        Collection<V> values():獲取集合中所有值的集合
      * e:長度功能
      *        int size():返回集合中的鍵值對的個數
      *
      * 注意:map集合是不可以直接迭代的
      */
     
     public static void main(String[] args) {
          Map<String,Integer> map = new HashMap<>();
          Integer i1 = map.put("張三", 23);
          Integer i2 = map.put("李四", 24);
          Integer i3 = map.put("王武", 25);
          Integer i4 = map.put("趙六", 26);
          /*Integer i5 = map.put("張三", 26);//相同的鍵不儲存,值覆蓋,把被覆蓋的值返回
          System.out.println(map);
          
          Integer value= map.remove("張三");// 根據鍵刪除元素,返回鍵對應的值
          System.out.println(value);*/
          
          System.out.println(map.containsKey("張三"));//判斷是否包含傳入的鍵
          System.out.println(map.containsValue(100));//判斷是否包含傳入的值
          
          /*Collection<Integer> c = map.values();
          System.out.println(c);
          System.out.println(map.size());
          System.out.println(c.size());*/
          
     }
}

map的遍歷

(1)第一種方式:

package map;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
public class Demo2_Iterator {
     /**
      * 通過檢視Map集合的api發現沒有iterator方法,那麼雙列集合如何跌該呢?
      */
     public static void main(String[] args) {
          Map<String,Integer> map = new HashMap<>();
          map.put("張三", 23);
          map.put("李四", 24);
          map.put("王五", 25);
          map.put("趙六", 26);
          
          /*Integer i = map.get("張三");
          System.out.println(i);*/
          
          //獲取所有的鍵
          /*Set<String> keySet = map.keySet();//獲取所有鍵的集合
          Iterator<String> it = keySet.iterator();//獲取迭代器
          while(it.hasNext()) {                      //判斷集合中是否有元素
              String key = it.next();               //獲取每一個鍵
              Integer value = map.get(key);         //根據鍵獲取值
              System.out.println(key + ":" + value);
          }*/
          
          
          //使用增強for迴圈進行遍歷
          
          for(String str : map.keySet()) {//map.ketSet()是所有鍵的集合
              System.out.println(str + ":" + map.get(str));
          }
     }
}

(2)第二種方式

package map;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
public class Demo3_Iterator {
     
     /**
      * Map集合的第二種迭代,根據鍵值對物件,獲取鍵和值
      *  A:鍵值對物件找鍵和值的思路:
      *   獲取所有鍵值對物件的集合
      *   遍歷鍵值對物件的集合,獲取到每一個鍵值對物件
      *   根據鍵值對物件找鍵和值
      * @param args
      */
     
     public static void main(String[] args) {
          Map<String,Integer> map = new HashMap<>();
          map.put("張三", 23);
          map.put("李四", 24);
          map.put("王五", 25);
          map.put("趙六", 26);
          
          //Map.Entry說明Entry是Map的內部介面,將鍵和值封裝成了Entry物件,並存儲在Set集合中
          /*Set<Map.Entry<String,Integer>> entrySet = map.entrySet();
          //獲取每一個物件
          Iterator<Map.Entry<String,Integer>> it = entrySet.iterator();
          while(it.hasNext()) {
              //獲取每一個Entry物件
              Map.Entry<String, Integer> en = it.next();
              String key = en.getKey();                       //根據鍵值對物件獲取鍵
              Integer value = en.getValue();                  //根據鍵值對物件獲取值
              System.out.println(key + ":" + value);
          }*/
          
          for(Map.Entry<String, Integer> en : map.entrySet()) {
              System.out.println(en.getKey() + ":" + en.getValue());
          }
     }
}

HashMap示例演示
package map;
import java.util.HashMap;
public class Demo5_HashMap {
     /*
      * A:案例演示
      * HashMap集合鍵是Student值是String的案例
      * 鍵是學生物件,代表一個學生
      * 值是字串物件,代表學生歸屬地
      */
     public static void main(String[] args){
          HashMap<Student,String> hm = new HashMap<>();
          hm.put(new Student("張三",23), "北京");
          hm.put(new Student("張三",23),"上海");
          hm.put(new Student("李四",24), "廣州");
          hm.put(new Student("王五",25),"北京");
          
          System.out.println(hm);
              
     }
}

LinkedHashMap示例演示
package map;
import java.util.LinkedHashMap;
public class Demo6_LinkedHashMap {
     /**
      * LinkedHashMap保證了怎麼存就怎麼取
      * @param args
      */
     public static void main(String[] args) {
          LinkedHashMap<String,Integer> lhm = new LinkedHashMap<>();
          lhm.put("張三", 23);
          lhm.put("李四", 24);
          lhm.put("趙六", 26);
          lhm.put("王五", 25);
          
          System.out.println(lhm);
     }
}

TreeMap示例演示
package map;
import java.util.TreeMap;
importjava.util.Comparator;
public class Dmeo7_TreeMap {
     /**
      * TreeMap集合鍵是Student值是String的案例
      * @param args
      */
     
     public static void main(String[] args) {
          TreeMap<Student,String> tm = new TreeMap<>(new Comparator<Student>() {
              @Override
              public int compare(Student s1, Student s2) {
                   int num = s1.getName().compareTo(s2.getName()); //按照姓名比較
                   return num == 0 ? s1.getAge() - s2.getAge() : num;
              }
          });
          
          tm.put(new Student("張三",23), "北京");
          tm.put(new Student("李四",13), "上海");
          tm.put(new Student("王五",33), "廣州");
          
          System.out.println(tm);
     }
     
     public void demo() {
          TreeMap<Student,String> tm = new TreeMap<>();
          tm.put(new Student("張三",23), "北京");
          tm.put(new Student("李四",13), "上海");
          tm.put(new Student("王五",33), "廣州");
          
          System.out.println(tm);
     }
}

統計字串中每個字元出現的次數
package map;
import java.util.HashMap;
public class Test1 {
     /**
      * A:案例演示
      * 需求:統計字串中每個字元出現的次數
      *
      * 分析:
      * 1,定義一個需要被統計字元的字串
      * 2,將字串轉換為字元陣列
      * 3,定義雙列集合,儲存字串中字元以及字元出現的次數
      * 4,遍歷字元陣列獲取一個字元,並將字元儲存在雙列集合中
      * 5,儲存過程中要判斷,如果集合中不包含這個鍵,就將該字元當作鍵,值為1儲存,如果集合中包含這個鍵,就將值加1儲存
      * 6,列印雙列集合中獲取字元出現的次數
      */
     
     public static void main(String[] args) {
          //1,定義一個需要被統計字元的字串
          String s = "aaaabbbbbbccccccccccccccccccccccc";
          
          //2,將字串轉換為字元陣列
          char[] arr = s.toCharArray();
          
          //3,定義雙列集合,儲存字串中字元以及字元出現的次數
          HashMap<Character,Integer> hm = new HashMap<>();
          
          //4,遍歷字元陣列獲取每一個字元,並將字串儲存在雙列集合中
          
          for(char c : arr) {
              //5,儲存過程中要判斷,如果集合中不包含這個鍵,就將該字元當作鍵,值為1儲存,如果集合中包含這個鍵,就將值加1儲存
              /*if(!hm.containsKey(c)) {
                   hm.put(c,1);
              } else {
                   hm.put(c, hm.get(c) + 1);
              }*/
              hm.put(c, !hm.containsKey(c) ? 1 : hm.get(c) + 1);
          }
          
          System.out.println(hm);
          //6,列印雙列集合中獲取字元出現的次數
          
          for(Character key : hm.keySet()) {//hm.keySet()代表所有鍵的集合
              System.out.println(key + "=" + hm.get(key));//hm.get(key)根據鍵獲取值
          }
     }
}

HashMap和Hashtable的區別
package map;
import java.util.HashMap;
import java.util.Hashtable;
public class Demo9_Hashtable {
     /**
      * 面試題:
      * HashMap和Hashtable的區別
      * 共同點:
      * 底層都是雜湊演算法,都是雙列集合
      * 區別:
      * 1,HashMap是執行緒不安全的,效率高,JDK1.2版本
      * Hashtable是執行緒安全的,效率低,JDK1.0版本
      * 2,HashMap可以儲存null鍵和null值
      * Hashtable不可以儲存null鍵和null值
      */
     
     public static void main(String[] args) {
          HashMap<String,Integer> hm = new HashMap<>();
          hm.put(null, 23);
          hm.put("李四", null);
          System.out.println(hm);
          
          Hashtable<String,Integer> ht = new Hashtable<>();
          ht.put("張三", null);
     }
}