これはかなり長い間私を悩ませてきました。基本的に、独自のオブジェクト セット (ここでは MyObject と呼びます) をキーとしてマップに格納する場合、クラスのどこかに正確に同じオブジェクトが保存されていない限り、キー値を取得できません。同じ値を持つ 2 つのオブジェクトを比較すると通常 true を返す MyObject の equals メソッドをオーバーライドしようとしても、何も変わりませんでした。
私が言いたいことのデモンストレーションをあなたに与えるために:
Map<Integer, Integer> map = new HashMap<Integer, Integer>();
map.put(2, 3);
System.out.println(map.get(2)));
ここで、ご想像のとおり、マップで整数オブジェクト 2 を検索し、3 を出力します。整数が存在しない場合は、null を出力します。ここまでは順調ですね。
Map<String, Integer> map = new HashMap<String, Integer>();
map.put(new String("hi"), 3);
System.out.println(map.get(new String("hi")));
これも期待どおりに動作します。キー「hi」の値を取得しているだけです。
Map<MyObject, Integer> map = new HashMap<MyObject, Integer>();
map.put(new MyObject(), 3);
System.out.println(map.get(new MyObject()));
「new MyObject()」と「new MyObject()」の間に技術的な違いはありませんが、新しい MyObject をクラスのインスタンスとして保存し、そのインスタンスをパラメーターとして使用しない限り、とにかく null を返します。 get メソッド。
私の MyObject とは対照的に、キーが文字列または整数の場合、マップはキー値を簡単に取得しました。これらのタイプは特権を持っているだけですか、それともマップに「ねえ、新しく作成されたオブジェクトはそのリストのオブジェクトと似ています」と伝える方法はありますか? マップはオブジェクトをどのように比較しますか?