黑馬程序員--Java基礎學習筆記【集合-Map】

 

 ------Java培訓、Android培訓、iOS培訓、.Net培訓、期待與您交流! -------    

 

Map 接口

    Map 接口定義的集合,又稱查找表

    Map 接口和 Collection 接口沒關係

    Map 集合派系,存儲映射鍵值對

    不允許重複的鍵,每個鍵最多映射 1 個值

    根據內部數據結構不同,Map 接口有多種實現類:

常用的有內部爲 hash 表實現的 HashMap 和內部爲排序二叉樹實現的 TreeMap

Map 接口和 Collection 接口的不同

    Map Collection 是獨立的接口

    Map 雙列,存儲鍵值對映射關係,鍵具有唯一性,每個鍵只能映射 1 個值

    Collection 單列,存儲對象的引用,其 Set 子接口的元素是唯一的

    Map 的數據結構只針對鍵有效,跟值無關;Collection 的數據結構針對元素有效

 

Map 接口成員方法

    V put(K key, V value)

// 將鍵值對存儲到集合,返回值一般是 null,存儲重複鍵返回被替換之前的值

    V get(Object key) // 根據鍵獲取值,如果不存在返回 null

    V remove(Object key) // 移除指定鍵的映射關係,返回該鍵對應的值

    void clear() // 清空集合

    boolean containsKey(Object key) // 判斷是否包含指定鍵的映射關係

    boolean containsValue(Object value) // 判斷是否包含指定值

    boolean isEmpty() // 判斷是否爲空

    int size() // 返回集合大小

    Set<K> keySet() // Map 集合中所有的鍵,存儲到 Set 集合

    Collection<V> values() // Map 集合中的所有值,存儲到 Collection 集合

    Set<Map.Entry<K, V>> entrySet() // 將所有鍵值對存儲到集合

 

Map 集合遍歷

第一種方式 Set<K> keySet():適合開發使用,簡單、代碼量少

Map 接口中定義的方法keySet,將 Map 集合中所有的鍵存儲到 Set 集合,迭代 Set 集合,獲取出 Set 集合中存儲的元素就是 Map 中的鍵,get() 根據鍵獲取值。

  1. 1.  調用 Map 集合方法 keySet,將所有鍵存儲到集合

  2. 2.  迭代 Set 集合,獲取 Set 集合存儲的對象

  3. 3.  Map 集合方法 get,傳遞鍵獲取值

Set<String>set= map.keySet();

 

Iterator<String>iterator= set.iterator();

while (iterator.hasNext()) {

    String key = (String) iterator.next();

 

    Integer value = map.get(key);

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

}

第二種方式Set<Map.Entry<K, V>> entrySet():適合面試考試

原理:存儲鍵值對,鍵值對的映射關係也是一個對象,對象的描述是接口,是 Map 接口的內部接口 Entry Map 集合中,實現了這個內部接口 Entry,重寫接口中的方法,可以讓我們獲取 Map 集合中的鍵值對。

Entry 的方法:K getKey(), V getValue()

  1. 1.  調用 Map 集合方法 entrySet將所有鍵值對映射關係對象(即 Map.Entry 接口的實現類對象)存儲到 Set 集合

  2. 2.  迭代 Set 集合,獲取 Set 集合存儲的對象(Map.Entry 接口的實現類對象)

  3. 3.  調用 Map.Entry 接口的方法 getKey, getValue 分別獲取鍵和值

Set<Map.Entry<String,Integer>> set2= map.entrySet();

 

Iterator<Map.Entry<String,Integer>> iterator2= set2.iterator();

while (iterator2.hasNext()) {

    Map.Entry<String, Integer> entry = (Map.Entry<String,Integer>) iterator2.next();

    String key = entry.getKey();

    Integer value = entry.getValue();

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

}

 

增強 for 循環遍歷示例

package cn.itcast;

 

import java.util.HashMap;

import java.util.Map;

import java.util.Map.Entry;

import java.util.Set;

 

/*

 * Map 接口和Iterable 沒有關係不具有獲取迭代器方法,

 * 增強for不能直接遍歷Map集合

 * 但是可以間接遍歷(遍歷的是Set

 */

public class MapForEach {

 

    publicstatic void main(String[] args) {

       Map<String,Integer> map = new HashMap<String, Integer>();

 

       map.put("a",1);

       map.put("b",2);

       map.put("c",3);

 

       Set<String>set = map.keySet();

       for(String key : set) {

           Integervalue = map.get(key);

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

       }

 

       System.out.println("-------------------");

       Set<Map.Entry<String,Integer>> set2 = map.entrySet();

       for(Entry<String, Integer> entry : set2) {

           Stringkey = entry.getKey();

           Integervalue = entry.getValue();

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

       }

    }

 

}

 

HashMap

    底層數據結構,鍵是哈希表結構,保證鍵的唯一性

(存儲自定義對象的鍵,需要重寫 hashCode equals 方法)

    允許存儲 null 鍵值

    存儲速度快,線程不安全集合,運行速度快

 

LinkedHashMap 繼承 HashMap

    基於鏈表和哈希表的實現,線程不安全集合

    維護着一個雙向循環鏈表,此鏈表定義了迭代順序,通常是存放元素的順序

    有序 Map 集合,存儲取出的順序一致,具有可預知的迭代順序

 

TreeMap

    底層數據結構是紅黑樹(保證鍵的排序和唯一性)

    對存儲的鍵進行排序,自然排序和比較器排序

    線程不安全集合運行速度快

 

  • 獲取字符串中每個字母出現的次數

package cn.itcast;

 

import java.util.TreeMap;

 

/*

 * 統計字符串中每個字母出現的次數

 *

 * 思路:

 *  將字符串轉成字符數組,遍歷字符數組,

 *  將每個字母及其出現的次數存進 Map 集合

 *  遍歷存儲集合完成後,取出集合中的鍵值

 */

publicclassTreeMapTest {

 

    publicstaticvoid main(String[] args) {

       Stringstring= "wwwitcastcn";

       // Map 集合存儲字母及其出現的次數

       TreeMap<Character,Integer> map= newTreeMap<Character, Integer>();

 

       char[] arr = string.toCharArray();

       for (charc : arr) {

           // 獲取字母已出現的次數並根據當前迭代情況修改

           Integervalue= map.get(c);

           if (value == null) {

              map.put(c, 1);

           }else{

              map.put(c, ++value);

           }

       }

      

       // 遍歷集合中存儲的鍵(即每個字母),獲取相應的值(即字母出現的次數)

       for (charkey : map.keySet()) {

           Integervalue= map.get(key);

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

       }

    }

 

}

 

Hashtable 集合自身特性

    底層數據結構是哈希表,保證鍵的唯一性

    不允許存儲 null 鍵值

    線程安全集合,運行速度慢

 

Properties 繼承 Hashtable

    底層數據結構是哈希表,線程安全集合

    可以和IO流結合使用,實現數據持久性存儲

    存儲和取出的代碼和HashMap 完全一樣

 

    爲什麼沒有泛型?固定集合存儲的類型,屬性列表中每個鍵、值都是字符串

    setProperty(String key, String value) // 將鍵值對存儲到集合

    String getProperty(String key) // 根據鍵獲取值

 

HashMap Hashtable 的區別

    二者都實現了 Map 接口,是將唯一鍵映射到特定的值上

    HashMap

線程不安全,運行速度快

       沒有排序,可以存儲 null 鍵和多個 null

    Hashtable

       線程安全,運行速度慢

       不可以存儲 null 鍵值

 

List, Set, Map 等接口是否都繼承自 Collection 接口

    List Set 繼承自 Collection接口,而 Map 不繼承任何接口

 

java.util.Collections 類,集合操作的工具類

    // 對集合中的元素進行自然順序排序

    //對自定義對象排序需要在類中實現 Coparable 接口並重寫 compareTo 方法

    Collections.sort(list);

 

    // 返回一個比較器對象,逆轉對象的自然順序

    Comparator<String>comparator= Collections.reverseOrder();

    Collections.sort(list, comparator);

 

// 對集合中的元素的順序進行反轉

    Collections.reverse(list);

 

// 二分法查找在集合中指定元素返回索引值

    intindex = Collections.binarySearch(list, "itcast");

 

// 對集合中的元素隨機排列

    Collections.shuffle(list);

 

  • Sting[] <-->List

   

    String[] strArr = {"www", ".itcat",".cn"};

    List<String> list = Arrays.asList(strArr); // fixed-sizelist

    for(String string : list) {

       System.out.print(string + " "); // www .itcast .cn

    }

   

    // list.add(""); // UnsupportedOperationException

   

    // java.util.Arrays$ArrayList

    System.out.println(list.getClass().getName());

   

    list.set(0, "3w"); // 可以修改元素

   

    // 如果想要添加元素,可以用如下方式:

   

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

    list1.addAll(list);

    System.out.println(list1); // [www, .itcast, .cn]

    list1.add("0807JavaSE");

    System.out.println(list1); // [www, .itcast, .cn, 0807JavaSE]


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章