-2

私はJavaを学ぼうとしています。Eric Roberts のテキスト「The Art and Science of Java」には、フライト予約コンソールをシミュレートするプログラミング課題があります。City クラスを使用して「クラスアップ」したかったのですが、City String だけで十分です。String である1 つのフィールドしかありませんがname、クラスの使用方法を学ぼうとしています。

とにかく、重複を避けるために、City クラスの equals メソッドをオーバーライドする必要がありました。そのため、hashCode メソッドをオーバーライドする必要がありました。

今、私のHashMap<City,ArrayList<Flight>>ものは機能していません。特定の値を見つけることができず、重複キーを許可します。

My CityequalshashCodeオーバーライドは次のとおりです。私の HashMap がうまくいかない理由は誰にも分かりますか?

/* (non-Javadoc)
 * @see java.lang.Object#equals(java.lang.Object)
 */
@Override
public boolean equals(Object that) {
    // TODO Auto-generated method stub
    if ( this == that ) return true;
    if ( !( that instanceof City) ) return false;
    City aThat = (City) that;
    return (name == aThat.name );
}

@Override
public int hashCode() {
    // TODO Auto-generated method stub
    return name.hashCode();
}
4

2 に答える 2

3

equals()の代わりにオブジェクト比較を使用するには====参照値を比較して、それらが同じオブジェクトを指しているかどうかを判断します。

@Override
public boolean equals(Object that) {
    //more code
    return (name.equals(aThat.name) );
}

ちなみに、hashCode()それも悪い原因で、namenull になる可能性があり、NullPointerException.

@Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + ((name == null) ? 0 : name.hashCode());
        return result;
    }

そして最後のアドバイスとして、hash structurehashMap のようなmutable objectsキーとして使用することはお勧めしません。これは、hashCode()変更され、予期しない動作が発生する可能性があるためです。キーとして使用することをお勧めしinmutable objectsます。City クラスが不変であれば問題ありませんが、そうでない場合は変更してください。

于 2013-08-26T01:29:39.777 に答える