しばらく調査を行って古い投稿を調べた後、文字列がキーである Java で Hashmap または Hashtable を使用すると、ハッシュの最初の「ラウンド」が各文字列オブジェクト hashCode に適用されることに気付きました (明らかに 2 番目のハッシュがあります)。 )の結果に適用される関数でint hashCode()
、デフォルトint hashCode()
ではメモリ内の呼び出し元の場所と何らかの関係があります(私が読んだものから)。そうは言っても、開発者が定義したキーのクラスを含むマップがある場合int hashCode()
、オブジェクトのいくつかの異なるフィールドをオーバーライドして使用して、各オブジェクトに対して可能な限り一意の int を返すことができることを読みました。ただし、プリミティブ型の配列を含む以下のコード フラグメントを検討してください。
import java.util.HashMap;
public class test
{
public static void main(String[] args) {
HashMap<char[], int[] > map = new HashMap<char[], int[]>();
String s = "Hello, World";
int x[] = { 1, 2, 3, 4, 5 };
map.put( s.toCharArray(), x );
x = map.get( s );
for ( int i : x )
System.out.print( i );
}
}
NullPointerException
もちろん、map.get( s );
null を返すため、プログラムはクラッシュします。map.put()
と の間に2 つの異なる参照があるため、これが発生したと思われますmap.get()
。プログラムに出力してもらいたいのは、1 2 3 4 5 です。
私の質問: 上記のコード フラグメントを取得して、キーの値とキーの参照によってキーを検索するにはどうすればよいですか? つまり、プログラムに 1 2 3 4 5 を出力させるにはどうすればよいでしょうか。
編集:ハッシュマップをルックアップテーブルとして使用しています。ファイルから文字列を読み取っていますが、読み取ったばかりの文字列がテーブルにあるかどうかをすばやく判断する方法が必要です。