HashMap
日本語 | 細切り地図 |
英語 | hash map |
ふりがな | はっしゅまっぷ |
フリガナ | ハッシュマップ |
「辞書」クラス。
J2SEに含まれるクラスのひとつ。パッケージも含めたクラス名はjava.util.HashMap。
Mapインターフェイスの実装クラスだが、広義の「コレクション」に含まれる。
「辞書」を実現するクラス。「値」を「キー」で登録し、「キー」を使用して「値」を取得できる。put()メソッドで追加し、get()メソッドで取得する。
キーひとつにつき値はひとつ。同じキーを複数登録することはできない。キーが同じかどうかはequals()メソッドでチェックされる。
値を追加する際に、キーのハッシュコードを元に「グループ分け」を行うため、値の取得時に「全検索」をする必要がなく、そのため他のコレクションより値の取得が早いというメリットがある。
要素としてObjectのサブクラス、つまりあらゆるクラスを受け取れる。しかしそのため、要素として格納されている型が不明のため、ClassCastExceptionが発生する可能性大。
特に、Javaでは「引数の参照経由で値を返す」のが難しいため、メソッドの戻り値としてHashMapを返し、その中に「複数の戻り値」として値を返すという「テクニック」があるが、メソッドの中身を見なければキーも型も分からず、バグの温床となりやすいため、この使用方法はすべきではない。
J2SEに含まれるクラスのひとつ。パッケージも含めたクラス名はjava.util.HashMap。
Mapインターフェイスの実装クラスだが、広義の「コレクション」に含まれる。
「辞書」を実現するクラス。「値」を「キー」で登録し、「キー」を使用して「値」を取得できる。put()メソッドで追加し、get()メソッドで取得する。
キーひとつにつき値はひとつ。同じキーを複数登録することはできない。キーが同じかどうかはequals()メソッドでチェックされる。
値を追加する際に、キーのハッシュコードを元に「グループ分け」を行うため、値の取得時に「全検索」をする必要がなく、そのため他のコレクションより値の取得が早いというメリットがある。
要素としてObjectのサブクラス、つまりあらゆるクラスを受け取れる。しかしそのため、要素として格納されている型が不明のため、ClassCastExceptionが発生する可能性大。
特に、Javaでは「引数の参照経由で値を返す」のが難しいため、メソッドの戻り値としてHashMapを返し、その中に「複数の戻り値」として値を返すという「テクニック」があるが、メソッドの中身を見なければキーも型も分からず、バグの温床となりやすいため、この使用方法はすべきではない。
参考サイト
// Sample.java
import java.util.HashMap;
public class Sample
{
public static void main( String[] args )
{
// HashMapを使用します。
HashMap hashMap = new HashMap();
// 要素を追加します。
hashMap.put( "Integer", "整数値型だよ" );
// 要素を取り出します。
System.out.println( hashMap.get("Integer" ) );
// 整数値型だよ
// put()の引数はObjectなので、クラスならなんでも受け取れます。
hashMap.put( new Integer( 1234 ), new Integer( 5678 ) );
// つまり、要素に入れる型は統一しなくてもOK
System.out.println( hashMap.get( new Integer( 1234 ) ) );
// 5678
// また、このキーの使い方から分かるとおり、
// キーかどうかは参照ではなくequals()で比較した結果を使用します。
// どんな型でも入るのは危険です。
try
{
Integer integer = (Integer)hashMap.get( "Integer" );
}
catch( ClassCastException e )
{
e.printStackTrace();
// java.lang.ClassCastException
// at Sample.main(Sample.java:27)
}
// 最悪、戻り値の型として「複数の値を返す」目的に
// 使われることもあります。
HashMap badHashMap = getDatas();
System.out.println( badHashMap.get( "string1" ) );
// 文字列1
System.out.println( badHashMap.get( "integer2" ) );
// 200
// この方法は「複数の値を戻り値として返せる」というメリットに対して、
// 「メソッドの実装を見ないとキーも型もわからない」という
// デメリットが非常に大きいです。
// こういう使い方は絶対にしないようにしましょう。
}
/**
* HashMapを戻り値として返す例(悪例です。やっちゃダメよ)。
*/
private static HashMap getDatas()
{
HashMap hashMap = new HashMap();
// 変数名をキーにして、値をセットします。
hashMap.put( "string1", "文字列1" );
hashMap.put( "integer2", new Integer( 200 ) );
return hashMap;
}
}
import java.util.HashMap;
public class Sample
{
public static void main( String[] args )
{
// HashMapを使用します。
HashMap hashMap = new HashMap();
// 要素を追加します。
hashMap.put( "Integer", "整数値型だよ" );
// 要素を取り出します。
System.out.println( hashMap.get("Integer" ) );
// 整数値型だよ
// put()の引数はObjectなので、クラスならなんでも受け取れます。
hashMap.put( new Integer( 1234 ), new Integer( 5678 ) );
// つまり、要素に入れる型は統一しなくてもOK
System.out.println( hashMap.get( new Integer( 1234 ) ) );
// 5678
// また、このキーの使い方から分かるとおり、
// キーかどうかは参照ではなくequals()で比較した結果を使用します。
// どんな型でも入るのは危険です。
try
{
Integer integer = (Integer)hashMap.get( "Integer" );
}
catch( ClassCastException e )
{
e.printStackTrace();
// java.lang.ClassCastException
// at Sample.main(Sample.java:27)
}
// 最悪、戻り値の型として「複数の値を返す」目的に
// 使われることもあります。
HashMap badHashMap = getDatas();
System.out.println( badHashMap.get( "string1" ) );
// 文字列1
System.out.println( badHashMap.get( "integer2" ) );
// 200
// この方法は「複数の値を戻り値として返せる」というメリットに対して、
// 「メソッドの実装を見ないとキーも型もわからない」という
// デメリットが非常に大きいです。
// こういう使い方は絶対にしないようにしましょう。
}
/**
* HashMapを戻り値として返す例(悪例です。やっちゃダメよ)。
*/
private static HashMap getDatas()
{
HashMap hashMap = new HashMap();
// 変数名をキーにして、値をセットします。
hashMap.put( "string1", "文字列1" );
hashMap.put( "integer2", new Integer( 200 ) );
return hashMap;
}
}
// Sample.java import java.util.HashMap; public class Sample { public static void main( String[] args ) { // HashMapを使用します。 HashMap hashMap = new HashMap(); // 要素を追加します。 hashMap.put( "Integer", "整数値型だよ" ); // 要素を取り出します。 System.out.println( hashMap.get("Integer" ) ); // 整数値型だよ // put()の引数はObjectなので、クラスならなんでも受け取れます。 hashMap.put( new Integer( 1234 ), new Integer( 5678 ) ); // つまり、要素に入れる型は統一しなくてもOK System.out.println( hashMap.get( new Integer( 1234 ) ) ); // 5678 // また、このキーの使い方から分かるとおり、 // キーかどうかは参照ではなくequals()で比較した結果を使用します。 // どんな型でも入るのは危険です。 try { Integer integer = (Integer)hashMap.get( "Integer" ); } catch( ClassCastException e ) { e.printStackTrace(); // java.lang.ClassCastException // at Sample.main(Sample.java:27) } // 最悪、戻り値の型として「複数の値を返す」目的に // 使われることもあります。 HashMap badHashMap = getDatas(); System.out.println( badHashMap.get( "string1" ) ); // 文字列1 System.out.println( badHashMap.get( "integer2" ) ); // 200 // この方法は「複数の値を戻り値として返せる」というメリットに対して、 // 「メソッドの実装を見ないとキーも型もわからない」という // デメリットが非常に大きいです。 // こういう使い方は絶対にしないようにしましょう。 } /** * HashMapを戻り値として返す例(悪例です。やっちゃダメよ)。 */ private static HashMap getDatas() { HashMap hashMap = new HashMap(); // 変数名をキーにして、値をセットします。 hashMap.put( "string1", "文字列1" ); hashMap.put( "integer2", new Integer( 200 ) ); return hashMap; } }