Javaでハッシュテーブル(または連想配列...)を作成する最も簡単な方法は何ですか? 私のgoogle-fuはいくつかの例を見つけましたが、これを行う標準的な方法はありますか?
また、各ペアのオブジェクトで add メソッドを個別に呼び出さずに、キーと値のペアのリストをテーブルに入力する方法はありますか?
Map map = new HashMap();
Hashtable ht = new Hashtable();
どちらのクラスも java.util パッケージにあります。2 つの違いは、次のjGuru FAQ エントリで説明されています。
二重中括弧を使用してデータを設定できます。引き続き add または put を呼び出しますが、見苦しくはありません。
private static final Hashtable<String,Integer> MYHASH = new Hashtable<String,Integer>() {{
put("foo", 1);
put("bar", 256);
put("data", 3);
put("moredata", 27);
put("hello", 32);
put("world", 65536);
}};
また、Map と Hashtable の両方が Java 5 以降では汎用であることも忘れないでください (コレクション フレームワークの他のクラスと同様)。
Map<String, Integer> numbers = new HashMap<String, Integer>();
numbers.put("one", 1);
numbers.put("two", 2);
numbers.put("three", 3);
Integer one = numbers.get("one");
Assert.assertEquals(1, one);
import java.util.HashMap;
Map map = new HashMap();
エドマンドが言ったこと。
常に .add を呼び出さないことに関しては、いいえ、慣用的ではありません。本当にやりたい場合は、さまざまなハック (配列に格納してからループ) を実行できますが、お勧めしません。
また、各ペアのオブジェクトで add メソッドを個別に呼び出さずに、キーと値のペアのリストをテーブルに入力する方法はありますか?
あなたの質問の問題点の 1 つは、そもそもデータがどのような形式であるかについて言及していないことです。ペアのリストがたまたま Map.Entry オブジェクトのリストである場合、それは非常に簡単です。
これを捨てるために、Hashtableの拡張であるjava.util.Propertiesという名前の(非常に悪意のある)クラスがあります。文字列のキーと値のみを想定し、ファイルまたはストリームを使用してデータをロードおよび保存できます。読み書きするファイルの形式は次のとおりです。
key1=value1
key2=value2
これがあなたが探しているものかどうかはわかりませんが、これが役立つ状況があります。
Java のハッシュ関数は最適ではないことに注意することが重要です。衝突を減らし、最大 50% の容量で再ハッシュをほぼ完全に排除したい場合は、Buz Hash アルゴリズムBuz Hashを使用します。
Java のハッシュ アルゴリズムが弱い理由は、文字列をハッシュする方法に最も明白です。
"a".hash()
"a"
-のASCII表現を与える97
ので、そう"b"
なるでしょう98
。ハッシュの全体的なポイントは、任意の「できるだけランダムな」番号を割り当てることです。
手早く汚いハッシュテーブルが必要な場合は、必ず を使用してjava.util
ください。よりスケーラブルで堅牢なものを探している場合は、独自の実装を検討します。