応用第6日目:コレクション②

HashMapとHashSetの使い方を学びます。キーと値の管理、重複の排除、equalsと==の違いを確認します。

応用 1 2 3 4 5 6 7

応用第6日目:コレクション②

HashMap

HashMapとは

HashMapは、キーのペアでデータを管理するコレクションです。キーは重複できませんが、値は重複しても構いません。キーを指定することで、対応する値を素早く取得できます。

  • put(キー, 値):キーと値のペアを追加します。
  • get(キー):キーに対応する値を取得します。
  • remove(キー):キーに対応するペアを削除します。
  • containsKey(キー):指定したキーが存在するか確認します。
  • size():要素数を返します。
SampleEx601.java
package exday6;

import java.util.*;

public class SampleEx601 {

    public static void main(String[] args) {
        HashMap<String,Integer> map = new HashMap<String,Integer>();
        String nengo[] = { "明治" , "大正" , "昭和" , "平成" };
        map.put(nengo[0], 1868);
        map.put(nengo[1], 1912);
        map.put(nengo[2], 1926);
        map.put(nengo[3], 1989);
        for(String s: nengo){
            System.out.println(s+"元年は、西暦"+map.get(s)+"年");
        }
    }
}
明治元年は、西暦1868年
大正元年は、西暦1912年
昭和元年は、西暦1926年
平成元年は、西暦1989年

年号をキー、元号の開始西暦を値として格納しています。map.get(s)でキーに対応する西暦を取得し、表示しています。(図6-1)

HashMapの構造

図6-1:HashMapの構造

HashSet

HashSetとは

HashSetは、重複を許さないコレクションです。同じ値を複数回追加しようとしても、1つしか格納されません。また、要素の順序は保証されません。

  • add(要素):要素を追加します(重複する場合は追加されません)。
  • remove(要素):要素を削除します。
  • contains(要素):要素が存在するか確認します。
  • size():要素数を返します。
SampleEx602.java
package exday6;

import java.util.*;

public class SampleEx602 {

    public static void main(String[] args) {
        HashSet<String> hs = new HashSet<String>();
        hs.add("山田太郎");
        hs.add("山田太郎");
        hs.add("太田美代子");
        hs.add("斉藤五郎");
        hs.add("斉藤五郎");
        for(String s:hs){
            System.out.println(s);
        }
    }
}
太田美代子
斉藤五郎
山田太郎

「山田太郎」と「斉藤五郎」は2回追加していますが、HashSetは重複を排除するため、それぞれ1回しか表示されません。なお、HashSetは順序を保証しないため、表示順は実行環境によって異なる場合があります。(図6-2)

HashSetの構造

図6-2:HashSetの構造

equalsと==の違い

オブジェクトの比較

Javaでは、オブジェクトの比較にequals()==演算子の2つが使えますが、意味が異なります。equals()値(内容)が等しいかを比較し、==同一のオブジェクトかを比較します。

SampleEx603.java
package exday6;

public class SampleEx603 {

    public static void main(String[] args) {
        String s1 = "ABCDEF";
        String s2 = "ABCDEF";
        String s3 = new String("ABCDEF");
        if(s1.equals(s2)){
            System.out.println("s1とs2の文字列は等しい");
        }else{
            System.out.println("s1とs2の文字列は等しくない");
        }
        if(s1.equals(s3)){
            System.out.println("s1とs3の文字列は等しい");
        }else{
            System.out.println("s1とs3の文字列は等しくない");
        }
        if(s1 == s2){
            System.out.println("s1とs2のオブジェクトは等しい");
        }else{
            System.out.println("s1とs2のオブジェクトは等しくない");
        }
        if(s1 == s3){
            System.out.println("s1とs3のオブジェクトは等しい");
        }else{
            System.out.println("s1とs3のオブジェクトは等しくない");
        }
    }
}
s1とs2の文字列は等しい
s1とs3の文字列は等しい
s1とs2のオブジェクトは等しい
s1とs3のオブジェクトは等しくない

s1とs2は同じリテラル文字列であるため、Javaは同じオブジェクトを参照します。そのため==でも等しいと判定されます。一方、s3はnew String()で新たにオブジェクトを生成しているため、s1とs3は別のオブジェクトであり、==では等しくないと判定されます。しかし文字列の内容は同じため、equals()ではいずれも等しいと判定されます。(図6-3)

Stringの==とequalsの違い

図6-3:Stringの==とequalsの違い

練習問題 応用6 へ →