応用第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年
大正元年は、西暦1912年
昭和元年は、西暦1926年
平成元年は、西暦1989年
年号をキー、元号の開始西暦を値として格納しています。map.get(s)でキーに対応する西暦を取得し、表示しています。(図6-1)
図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)
図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とs3の文字列は等しい
s1とs2のオブジェクトは等しい
s1とs3のオブジェクトは等しくない
s1とs2は同じリテラル文字列であるため、Javaは同じオブジェクトを参照します。そのため==でも等しいと判定されます。一方、s3はnew String()で新たにオブジェクトを生成しているため、s1とs3は別のオブジェクトであり、==では等しくないと判定されます。しかし文字列の内容は同じため、equals()ではいずれも等しいと判定されます。(図6-3)
図6-3:Stringの==とequalsの違い