[TIL] HashMap


HashMapとは?

  • Mapインタフェースは、キーと値を組み合わせたEntryオブジェクトを格納するMapの性質を有する.この場合、キーも値もオブジェクトになります.
  • 値は重複できますが、鍵は重複できません.重複するキー値を入力すると、キー値に格納されている既存の値が新しいキー値に変更されます.
  • HashMapはハッシュを使用するため、大量のデータをすばやく検索できます.
  • Listと異なり、Mapには順序がありません
  • 2.HashMap作成者/方法


    HashMap作成者

    HashMap<String, String> map1 = new HashMap<String, String>();     // new에서 타입 파라미터 생략 가능
    
    HashMap<String, String> map2 = new HashMap<>(map1);     // map1의 모든 값을 다 포함한 HashMap 생성
    
    HashMap<String, String> map3 = new HashMap<>(5);    // 초기 사이즈 지정
    
    HashMap<String, String> map4 = new HashMap<>() {{
      put("a", "apple");
    }};     // 초기 값 지정
    HashMapの値がストレージ容量を超えると、容量が増加するのではなく、増加します.したがって、初期格納されたデータ数がわかる場合は、初期サイズを指定することが望ましい.

    put() / get()

    put()はkeyとvalueのペアのデータを格納し、get()はパラメータとして渡されたkeyに対応する値を返す.
    キーが存在しない場合はnullを返します.
    HashMap<String, String> map = new HashMap<>();
    
    map.put("a", "apple");
    map.put("b", "banana");
    map.put("c", "carrot");
    map.put("a", "ant");
    
    System.out.println(map.get("a"));
    System.out.println(map.get("b"));
    System.out.println(map.get("d"));
    <出力>
    ant
    banana
    null

    remove() / clear()

    remove()パラメータとして渡された鍵の値を返し、データを削除する.データが存在しない場合はnullを返します.clear()HashMapのすべてのデータが削除されます.
    System.out.println(map.remove("a"));
    System.out.println(map.remove("c"));
    System.out.println(map.remove("z"));
    System.out.println(map);
    <出力>
    apple
    carrot
    null
    map: {b=banana}

    isEmpty()

    isEmpty()HashMapのデータが空の場合、trueまたはfalseが返されます.
    HashMap<String, String> map = new HashMap<>();
    
    map.put("a", "apple");
    map.put("b", "banana");
    map.put("c", "carrot");
    
    System.out.println(map.isEmpty());
    map.clear();
    System.out.println(map.isEmpty());
    <出力>
    false
    true

    containsKey() / containsValue()

    containsKey()およびcontainsValue()は、パラメータとして渡されるキー/値を返し、HashMapに存在する場合はtrueまたはfalseとなる.
    HashMap<String, String> map = new HashMap<>();
    
    map.put("a", "apple");
    map.put("b", "banana");
    map.put("c", "carrot");
    
    System.out.println(map.containsKey("a"));
    System.out.println(map.containsValue("carrot"));
    System.out.println(map.containsValue("tomato"));
    <出力>
    true
    true
    false

    keySet() / values() / entrySet()

    keySet()HashMapからのみ鍵をインポートし、values()HashMapからvalueをインポートし、entrySet()keyとvalueをインポートします.主に複文を使用して全体の出力/ブラウズに使用されます.
    HashMap<String, String> map = new HashMap<>();
    
    map.put("a", "apple");
    map.put("b", "banana");
    map.put("c", "carrot");
    
    for (String key : map.keySet()) {
      System.out.print(map.get(key) + " ");
    }
    
    for (Map.Entry<String, String> entry : map.entrySet()) {
      System.out.println(entry);
    }
    <出力>
    a b c
    a=apple
    b=banana
    c=carrot

    replace()

    replace()パラメータとして渡されたkeyのvalueをパラメータとして渡されたvalueに置き換える.置換および削除された値が返され、存在しないキーがパラメータとして渡されるとnullが返されます.
    HashMap<String, String> map = new HashMap<>();
    
    map.put("a", "apple");
    map.put("b", "banana");
    map.put("c", "carrot");
    
    System.out.println(map.replace("a", "ant"));
    System.out.println(map.replace("z", "zero"));
    System.out.println(map);
    <出力>
    apple
    null
    map: {b=banana, a=ant, c=carrot}

    getOrDefault() / putIfAbsent() / computeIfAbsent() / computeIfPresent()

  • getOrDefault(Object Key, Object defaultValue):渡された鍵が存在する場合、その鍵の値が返され、存在しない場合、設定されたデフォルト値が返されます.ただし、この値はmapには格納されません.
  • Map<String, String> map = new HashMap<>();
    map.put("a", "apple");
    map.put("b", "banana");
    
    System.out.println(map.getOrDefault("a", "fruit"));
    System.out.println(map.getOrDefault("z", "fruit"));
    
    for (char c : map.keySet() ) {
    	System.out.printf("%s %s\n", c, map.get(c));
    }
    <出力>
    apple
    fruit
    a apple
    b banana
  • putIfAbsent(Object Key, Object Value):キーに値がない場合、またはnullの場合、値が追加されます.上記と同様にgetOrDefaultは値を保存せず、putIfAbserverはmapに追加されます.
  • Map<String, String> map = new HashMap<>();
    map.put("a", "apple");
    map.put("b", "banana");
    
    System.out.println(map.putIfAbsent("a", "fruit"));
    System.out.println(map.putIfAbsent("z", "fruit"));
    
    for (char c : map.keySet() ) {
    	System.out.printf("%s %s\n", c, map.get(c));
    }
    <出力>
    apple
    fruit
    a apple
    b banana
    z fruit
  • compute():キー値の演算方法を定義します.存在しない鍵を受け取った場合、エラーが発生します.
  • Map<String, Integer> map = new HashMap<>();
    map.put("a", 0);
    map.put("b", 0);
    
    System.out.println(map.compute("a", (k, v) -> ++v));
    
    for (char c : map.keySet() ) {
    	System.out.printf("%c %d\n", c, map.get(c));
    }
    <出力>
    1
    a 1
    b 0
  • computeIfAbsent():キーの値が存在しない場合のみ関数を実行し、キーの値が存在する場合は既存のキーの値を返します
  • Map<String, Integer> map = new HashMap<>();
    map.put("a", 0);
    map.put("b", 0);
    
    System.out.println(map.computeIfAbsent("a", key -> 10));
    System.out.println(map.computeIfAbsent("f", key -> 10));
    
    for (char c : map.keySet() ) {
    	System.out.printf("%c %d\n", c, map.get(c));
    }
    <出力>
    0
    10
    a 0
    b 0
    f 10
  • computeIfPresent():ram多項式は、キーの値が存在する場合にのみ実行されます.キーの値が存在しない場合はnullを返します.
  • Map<String, Integer> map = new HashMap<>();
    map.put("a", 0);
    map.put("b", 0);
    
    System.out.println(map.computeIfPresent("a", (k, v) -> ++v));
    System.out.println(map.computeIfPresent("f", (k, v) -> ++v));
    
    for (char c : map.keySet() ) {
    	System.out.printf("%c %d\n", c, map.get(c));
    }
    <出力>
    1
    null
    a 1
    b 0