4

私は持っていMap<Date, Stringます。a, b等しい2 つの Date オブジェクトがあります。key に関連付けられたマップに文字列値を配置しましたaa次に、キーに関連付けられたマップ値を取得しようとしますが、入れた値bのみを返します。キーaで値を取得することは可能ですか? bキーが単純な文字列の場合、これが可能であることはわかっています。これが他のタイプのオブジェクトでは機能しないのはなぜですか?

public class Main {

public static void main(String[] args) {
    Map<Date, String> map = new HashMap<Date, String>();

    Date a = new Date(20131105);
    Date b = new Date(20131105);

    map.put(a, "sweet");

    System.out.println(map.get(a));
    System.out.println(map.get(b));
}

static class Date {
    private int ymd;

    public Date(int ymd) {
        this.ymd = ymd;
    }

    public int getYmd() {
        return ymd;
    }

    @Override
    public boolean equals(Object obj) {
        if (obj instanceof Date) {
            return ((Date) obj).ymd == ymd;
        }
        return false;
    }
}

}

出力は次のとおりです。

sweet
null
4

4 に答える 4

5

日付オブジェクトを格納するために を使用しているため、キー オブジェクトは hashCode を使用してデータ構造に格納されるため、メソッドHashMapをオーバーライドする必要があります。hashCode()

非常に基本的なhashCode()オーバーライド (説明用):

@Override
public int hashCode(){
   return ymd;
}

出力:

甘い
甘い

于 2013-11-05T13:08:43.203 に答える
2

ハッシュマップは、hashCode関数を使用して要素をハッシュします。ほとんどの型では、ハッシュ コードはオブジェクトの参照を使用して計算されます。これは Date の場合です。あなたの場合、2 つの日付の値は同じですが、同じオブジェクトではありません。したがって、それらは異なる参照を持っているため、それらのハッシュ コードは異なります。HashMaphashCode 内の要素を検索すると、 が使用されるため、bはとhashCodeは異なるため、を使用してキーをa持つhashCode要素を見つけることはできません。ab

于 2013-11-05T13:13:31.790 に答える
1

クラスhashCode()にメソッドを実装する必要がありますDate

以下のコードを Date クラスに追加します

    @Override
    public int hashCode() {              
          return ymd;
    }

出力

sweet
sweet
于 2013-11-05T13:14:10.700 に答える