iT邦幫忙

0

[Java] Map 是什麼 (詳解)

閱讀時間: 5分鐘

見到坊間有很多中文教學都對Map的解釋不清楚及出現誤解,
所以想花些時間給大家清楚簡單地說明。
Map是Java的collections framework中的其中一類interface(介面),100%不是collection(集合),也不會inherit(繼承) Collection interface。所以不會extend Collection interface。

  1. Map特點:

    1. 可以儲存key/value值,每一個key都有相對應的value值。
    2. 不可以出現相同key值。
    3. 有3個collection views(即是3個Methods),分別是:
      • set of keys (對應的方法是keySet() method),
      • a collection of values (對應的方法是values() method),
      • set of key-value mappings (對應的方法是entrySet() method)。
  2. Implementation(實作)
    有5個常用implementation(實作)的方式,分別是HashMap, TreeMap, WeakHashMap, EnumMap和 LinkedHashMap。

  3. Subinterface(子介面)
    有3個常用的subinterface(子介面),分別是SortedMap, NavigableMap, 和ConcurrentMap。

  4. 怎麼使用Map?
    首先要import java.util.Map package,之後必須選擇一個合適的class來implement(實作) Map interface。

// 現在就隨意選一個,選HashMap class
Map<Key, Value> testingMap= new HashMap<>();

上面的一句就是創建一個新的Object(物件),名字叫testingMap,類別為Map。
另外,由於選擇HashMap class,可以自由使用HashMap的Method。
其實每個可以implement Map interface的class都有不同的功能,可以因應自己的需求去決定使用什麼class。

  1. Map的Method(方法)
    可以到官網查閱詳細及最新的資料 - Interface Map<K,V>
    以下是部分Method:
  • put(K, V) –
    新增key及value的值,如果已經存在,就會直接取代舊值。
  • putAll() –
    把另一個指定的map內的所有key及value的值加入現在的map。
  • putIfAbsent(K, V) -
    新增key及value的值,如果已經存在,就沒有改動。
  • get(K) –
    返回key的value值,如果key不存在,就會直接返回null值。
  • getOrDefault(K, defaultValue) -
    返回key的value值,如果key不存在,就會直接返回defaultValue的值。
  • containsKey(K) –
    檢查key是否存在於map內。.
  • containsValue(V) -
    檢查value是否存在於map內。
  • replace(K, V) –
    取代value的值。
  • replace(K, oldValue, newValue) -
    取代value的舊值。
  • remove(K) –
    刪除key及對應的value.
  • remove(K, V) -
    刪除key及對應的value.
  • keySet() -
    返回map內的所有key值。
  • values() -
    返回map內的所有value值。
  • entrySet() -
    返回map內的所有key和value值。
  1. 使用HashMap來implement Map (例子)
import java.util.Map;
import java.util.HashMap;

public class TestingMap {

    public static void main(String[] args) {
        // 選擇HashMap來創建新的Map物件
        Map<String, Integer> testingMapObject = new HashMap<>();

        // 新增元素(element)到Map物件 - testingMapObject
        testingMapObject.put("One", 1);
        testingMapObject.put("Two", 2);
        
        // 列出testingMapObject內的所有key及對應的value
        System.out.println("Map: " + testingMapObject);

        // 列出testingMapObject內的所有key
        System.out.println("Keys: " + testingMapObject.keySet());

        // 列出testingMapObject內的所有value
        System.out.println("Values: " + testingMapObject.values());

        // 列出testingMapObject內的所有key及對應的value
        System.out.println("Entries: " + testingMapObject.entrySet());
        
        // 檢查testingMapObject內有沒有特定元素的key
        System.out.println("Contain 2?: " + testingMapObject.containsKey("Two"));
        
        // 刪除testingMapObject內的一個元素,然後把相對應的值列印出來
        int value = testingMapObject.remove("Two");
        System.out.println("Removed Value: " + value);
        
        // 檢查testingMapObject內有沒有特定元素的key
        System.out.println("Contain 2?: " + testingMapObject.containsKey("Two"));
        
        // 檢查testingMapObject內有沒有特定元素的key
        testingMapObject.putIfAbsent("One",2);
        

    }
}

參考文章/網站/書本:
(注意,我所參考的文章有不同錯誤的地方,我只參考當中正確的部分)


尚未有邦友留言

立即登入留言