1. 程式人生 > 程式設計 >java基礎之map集合總結

java基礎之map集合總結

1 什麼是map集合?

我認為map集合的使用了儲存具有那種對應關係的物件的集合。根據Interface Map<K,V> K鑰匙的Map保持型 V 對映的值的型別,集合中儲存了兩個屬性,一個是key一個是value,也就是鍵值對的關係,找到鍵就可以相應的值,就類似學生的學號,我們的身份證,都是和我一一對應的。 其實這個也可以和collection集合做個比較: 圖:

1.1 Map集合中常用的子類:

AbstractMap, Attributes, AuthProvider, ConcurrentHashMap, ConcurrentSkipListMap, EnumMap, HashMap, Hashtable, IdentityHashMap, LinkedHashMap, PrinterStateReasons, Properties, Provider, RenderingHints, SimpleBindings, TabularDataSupport, TreeMap, UIDefaults, WeakHashMap

  • HashMap:

底層是hash表組成(陣列+連結串列的結構的,在jdk1.8之後是陣列+連結串列/紅黑樹),元素的存取的順序不一樣,無序集合。在自定義資料型別的時候,為了保證資料的唯一性,必須重寫Hashcode()和equals方法,保證key的唯一性

  • LinkHashMap:

同樣底層是hash表+連結串列的結構,因為多加了一條連結串列,就可以保證儲存資料的順序,有序集合,也就是通過重寫了Hashcode()和equals方法 實現了資料的唯一性。

1.2 Map集合中常用方法

api檔案:

  • public v put (K key,V value);將指定的值與此對映中的指定鍵關聯(可選操作)。

  • public v remove(Object key); 如果存在(可選操作),則從該Map中移除一個鍵的對映。

  • public V get(Object key) 根據指定的鍵,在Map集合中獲取對應的值。(value)

  • public Set keySet() : 獲取Map集合中所有的鍵,儲存到Set集合中。

  • public boolean containsKey(Object key) /containsValue(Object value)

  • public Set<Map.Entry<K,V>> entrySet() : 獲取到Map集合中所有的鍵值對物件的集合(Set集合);判斷集合中是否儲存value或者key,多判斷key。

  • 程式碼如下:

      private static void showPutMethod() {
          /**
           * put語法規則
           * 首次新增元素的時候,如果k的值是不重複的 則會返回一個null
           * 如果新增重複k的值 則第二次新增的v的值會把第一次v的值替換的 返回的是被替換的數值
           * k是不允許重複的 而value是可以重複的
           */
          Map<String,String> map = new HashMap<>();
          String put = map.put("zsb","張博陽");
          String put1 = map.put("zsb","昔年");
          String put2 = map.put("dsa","褐瞳");
          String put3 = map.put("ewqe","心塞");
          String put4 = map.put("zsgf","昔年");
          System.out.println(map);
      }
    
      /**
       * remove(object k)指定k 返回v
       * 存在則有返回值
       * 不存在 返回null
       */
          private static void removeTestMethod() {
              Map<String,Integer> map = new HashMap<>();
      //        String person = map.put("海綿寶寶","100");
      //        String person2 = map.put("派大星","230");
      //        String person3 = map.put("章魚哥","321");
      //        String person4 = map.put("蟹老闆","456");
      
      //        String one = map.remove("海綿寶寶");
      //        System.out.println(one);//返回100
      
              //返回null
              Integer dsada = map.remove("dsada");
              System.out.println(dsada);//null
    
      }
    
          /**
               * get語法規則 輸入數值 返回鍵的關係
               * 有鍵返回值數值
               * 沒有鍵 返回空
           * */
      //map集合儲存
          Map<String,String> mapList = new HashMap<>();
          String put = mapList.put("zsb","一品御前帶刀侍衛");
          System.out.println(put);
          mapList.put("派大星","赤犬星");
          mapList.put("海綿寶寶","黃袁寶寶");
          mapList.put("章魚哥","青雉魚");
          mapList.put("zsb","酷酷的張博陽");
          //get方法
          String zz = mapList.get("章魚哥");
          System.out.println(zz);   // 返回青雉魚
          System.out.println(mapList);
    
      
      /**
       * containsKey
       * 查詢集合中是否包含該元素
       * 如果有 true
       * 沒有 false
       */
      private static void containsMethod(){
          Map<String,String> map = new HashMap<>();
          String one = map.put("zsb","保安隊長");
          String two = map.put("zsb","保安");
          String three = map.put("zsbaa","保安");
          String four = map.put("zsbss","保安");
    
    
          boolean zbs = map.containsKey("zsb");
          boolean zbs1 = map.containsKey("zdsadbs");
    
      
      //        System.out.println(zbs);//true
      //        System.out.println(zbs1);// false
    複製程式碼

1.3 Hashmap集合的遍歷方法

方法一:

通過keyset方法把Map集合轉換成Set集合,然後我們就可以對Set集合進行迴圈遍歷,可以使用增強for迴圈的方式,也可以使用迭代器的方式進行迴圈遍歷。在我們迴圈遍歷之後,我們拿到了key的數值,然後通過Map的get方法 然後可以獲得集合中的value方法:如圖所示

程式碼如下:

    Map<String,String> mapList = new HashMap<>();
    String put = mapList.put("zsb","一品御前帶刀侍衛");
    System.out.println(put);
    mapList.put("派大星","赤犬星");
    mapList.put("海綿寶寶","黃袁寶寶");
    mapList.put("章魚哥","青雉魚");
    mapList.put("zsb","酷酷的張博陽");
    
    
    //利用增強for迴圈
     /**
     * 通過keyset方法把 map集合裡面的key的值儲存打set集合裡面,然後遍歷set集合,即可得到key的數值,然後通過map的
     * get方法 通過key獲得value 然後就完成了遍歷
     */
    Set<String> setList = mapList.keySet();
    for (String s : setList) {// 這裡可以直接寫 :mapList.keySet();
        //現在拿到集合裡面的value的數值了 然後通過map.get的方法 獲得裡面的數值
        String value = mapList.get(s);
        System.out.println(value);
    }
    //利用迭代器進行迴圈遍歷
    System.out.println("-----------------");
    Iterator<String> iteratorSet = setList.iterator();
    while (iteratorSet.hasNext()) {
        String next = iteratorSet.next();
        String value2 = mapList.get(next);
        System.out.println(value2);
    }
複製程式碼

方法2 通過他的內部巢狀類(entry)進行呼叫

當Map集合建立的時候,就自動建立了Entry物件,用來記錄鍵和值的關係。 我們可以通過Map.entrySet方法把Map集合中的多個Entry物件取出來儲存到set集合中 ,剩下的就和上面一樣通過迴圈的方式進行遍歷,但是Entry介面,他自己有兩個方法分別是getkey和 getValue方法 然後分別獲取鍵和值。 程式碼如下:

public static void main(String[] args) {
    Map<String,"一品御前帶刀侍衛");
    mapList.put("派大星","酷酷的張博陽");

    //增強for迴圈的方式
    for (Map.Entry<String,String> entryList :mapList.entrySet()){
        String key = entryList.getKey();
        String value = entryList.getValue();
        System.out.println(key + value);
    }

    //利用迭代器方式
    Set<Map.Entry<String,String>> entries = mapList.entrySet();
    Iterator<Map.Entry<String,String>> iterator = entries.iterator();
    while (iterator.hasNext()) {
        Map.Entry<String,String> next = iterator.next();
        String key = next.getKey();//分別獲取到key的數值
        String value = next.getValue();//分別獲得value的數值
        System.out.println(key + value);
    }
}
//同樣是for迴圈為什麼這個entry不能同Map.get()方法獲得value值,把獲得next穿進去,為什麼返回值是null
//我探究了一下 之前的Map集合建立了set物件 裡面儲存的是key的集合,當然可以用get方法傳遞key獲得value
//而entry就不同了,集合裡面儲存的是迴圈遍歷之後的entry物件,又不是key當然獲取不出來了。
複製程式碼

自定義資料型別

如果自定義資料型別作為鍵的話,一定要重寫裡面的getCode和equals方法保證鍵的唯一性

程式碼如下: 自定義資料型別:

 @Override
public boolean equals(Object o) {
    if (this == o) return true;
    if (o == null || getClass() != o.getClass()) return false;
    People people = (People) o;
    return age == people.age &&
            Objects.equals(name,people.name);
}

@Override
public int hashCode() {

    return Objects.hash(name,age);
}


主方法如下:
public static void main(String[] args) {
    getMethod();
    getMethod2();

}
private static void getMethod(){
    HashMap<People,String> peopleStringHashMap = new HashMap<>();
    peopleStringHashMap.put(new People("海綿寶寶",20),"蟹黃堡廚師");
    peopleStringHashMap.put(new People("派大星","海綿寶寶最好的朋友");
    peopleStringHashMap.put(new People("章魚哥",30),"蟹黃包的收銀員");

    //遍歷集合
    for (People people : peopleStringHashMap.keySet()) {
        String value = peopleStringHashMap.get(people);
        System.out.println(value);
    }
}
private static void getMethod2() {
    HashMap<People,"蟹黃包的收銀員");

    //通過建立entry物件的方式
    Set<Map.Entry<People,String>> entries = peopleStringHashMap.entrySet();
    //建立迭代器
    Iterator<Map.Entry<People,String>> iterator = entries.iterator();
    while (iterator.hasNext()) {
        Map.Entry<People,String> entry = iterator.next();
        People key = entry.getKey();
        String value = entry.getValue();
        System.out.println(key + value);
    }
}
複製程式碼

1.3 linkHashMap和linkHashtable

  • linkHashMap相比HashMap集合就是多了一個link然後可以保證存取順序,這點是最大的區別
  • 而linkHashtable 底層是一個雜湊表,是單執行緒的速度較慢,集合不能儲存null建和值(在1.2之後被hashMap取代)