Java
 Computer >> コンピューター >  >> プログラミング >> Java

JavaのHashMapに重複キーを追加するとどうなる?putメソッドの動作を解説

HashMapは、Mapインターフェースを実装するクラスの一つで、内部的にはハッシュテーブルを基盤として動作します。null値やnullキーも許容できるのが特徴です。

HashMapオブジェクトにはキーと値のペア(エントリ)を格納できます。格納後は、キーを指定することで対応する値を取得できます。ただし、キーとして使用する値は一意(ユニーク)である必要があります。

重複キーを追加した場合の動作

putメソッドは、指定したキーに値を関連付ける役割を持ちます。つまり、すでに存在するキーを持つキー・バリューのペアを追加すると、既存のキーの値が新しい値で上書き(置き換え)されます。エラーが発生したり、同じキーのエントリが複数登録されたりすることはありません。

なお、putメソッドは戻り値として、置き換え前の古い値を返します。キーが存在しなかった場合はnullが返されるため、この戻り値を利用すると「新規追加か更新か」を判定することも可能です。

サンプルコード

import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
public class DuplicatesInHashMap {
   public static void main(String args[]) {
      HashMap<String, Long> map = new HashMap<String, Long>();
      map.put("Krishna", 9000123456L);
      map.put("Rama", 9000234567L);
      map.put("Sita", 9000345678L);
      map.put("Bhima", 9000456789L);
      map.put("Yousuf ", 9000456789L);
      System.out.println("Values Stored . . . . . .");
      //Retrieving the values of a Hash map
      Iterator it1 = map.entrySet().iterator();
      System.out.println("Contents of the hashMap are: ");
      while(it1.hasNext()){
         Map.Entry <String, Long> ele = (Map.Entry) it1.next();
         System.out.print(ele.getKey()+" : ");
         System.out.print(ele.getValue());
         System.out.println();
      }
      map.put("Bhima", 0000000000L);
      map.put("Rama", 0000000000L);
      //Retrieving the values of a Hash map
      Iterator it2 = map.entrySet().iterator();
      System.out.println("Contents of the hashMap after inserting new key-value pair: ");
      while(it2.hasNext()){
         Map.Entry <String, Long> ele = (Map.Entry) it2.next();
         System.out.print(ele.getKey()+" : ");
         System.out.print(ele.getValue());
         System.out.println();
      }
   }
}

実行結果

Values Stored . . . . . .
Contents of the hashMap are:
Yousuf : 9000456789
Krishna : 9000123456
Sita : 9000345678
Rama : 9000234567
Bhima : 9000456789
Contents of the hashMap after inserting new key-value pair:
Yousuf : 9000456789
Krishna : 9000123456
Sita : 9000345678
Rama : 0
Bhima : 0

この実行結果から、次のことが確認できます。

  • 最初の段階では、5つのキー・バリューのペアがそのまま格納されている。
  • 既存のキー「Bhima」と「Rama」に対して再度putメソッドを呼び出しても、エントリの総数は5つのままで増えていない。
  • 「Bhima」と「Rama」の値だけが新しい値「0」に置き換わっている。

これは、HashMapでは各キーが常に一意に保たれる仕組みになっているためです。重複したキーでの追加操作は、新しいエントリの挿入ではなく既存エントリの値の更新として処理されます。この特性を理解しておくと、意図しないデータの上書きを防ぎ、HashMapをより安全に活用できます。

  1. JavaのJSeparatorクラスとは?重要性と基本的な使い方を解説

    JSeparatorクラスとはJSeparatorは、Swingで提供されるコンポーネント同士を視覚的に区切るためのクラスです。水平または垂直の区切り線、あるいは余白(空白スペース)として表示され、GUIの見やすさと整理されたレイアウトを実現します。JSeparatorクラスの主な役割は、レイアウト内のコンポーネント間に区切り線を描画して分離することです。これにより、関連する項目をグループ化し、ユーザーインターフェース全体の可読性を高めることができます。メニューやツールバーへの区切り線の追加メニューやツールバーにセパレータを追加する最も簡単な方法は、JMenu、JPopupMenu、JTool

  2. Javaでスーパークラスのfinalメソッドをオーバーライドするとどうなる?エラーの原因とルールを解説

    Javaにおいて、スーパークラス(親クラス)でfinalキーワードを付けて宣言されたメソッドは、サブクラス(子クラス)からオーバーライドすることができません。もしfinalメソッドをオーバーライドしようとすると、コンパイル時にエラーが発生します。これは、final修飾子が「そのメソッドの実装を変更させない」という意図を持っているためです。設計上、継承先での挙動変更を防ぎたい場合にfinalメソッドが使われます。メソッドオーバーライドを実装するためのルールオーバーライドするメソッドの宣言(メソッド名・引数・戻り値の型など)は、オーバーライド対象のメソッドと同一である必要があります。サブクラスは、