1

これは、hasmap に入れるために使用するクラスです。equals()hashcode()メソッドの両方をオーバーライドしています。

class Dog
    {
        public String name;
        public Dog(String n)
        {
            name=n;
        }
        @Override
        public int hashCode() {
            System.out.println("in hashcode");
            return name.length();
        }
        @Override
        public boolean equals(Object obj) {
            System.out.println("in equals");
            if (this == obj)
                return true;
            if (obj == null)
                return false;
            if (getClass() != obj.getClass())
                return false;
            Dog other = (Dog) obj;
            if (name == null) {
                if (other.name != null)
                    return false;
            } else if (!name.equals(other.name))
                return false;
            return true;
        }


    }

メインのこのコード

Map<Object,Object> m=new HashMap<Object,Object>();
        Dog d1=new Dog("clover");
        m.put(d1,"Dog Key");
        System.out.println(m.get(d1));

生産する

in hashcode
in hashcode
Dog Key

しかし、次のコード

Map<Object,Object> m=new HashMap<Object,Object>();
        Dog d1=new Dog("clover");
        m.put(d1,"Dog Key");
        System.out.println(m.get(new Dog("clover")));

生産する

in hashcode
in hashcode
in equals
Dog Key

ご覧のとおりequals()、2 番目の出力にメソッドの呼び出しがあります。どうしてこんなことに?
2 番目の質問
キー Map m=new HashMap(); の name 属性を変更すると、

Dog d1=new Dog("clover");
        m.put(d1,"Dog Key");

        d1.name="arthur";
        System.out.println(m.get(new Dog("clover")));

o/p は

in hashcode
in hashcode
in equals
null

キーの値を変更しましたが、同じキーを指定して値を取得しようとしています。では、なぜ null を取得するのでしょうか。

4

3 に答える 3

3

最初の質問: は、同じハッシュ コードを持つ 2 つのオブジェクトが実際に等しいことを確認するためHashMapに呼び出す必要があります。以前に指定されたものとまったく同じオブジェクトを使用するという特殊なケースをチェックするために使用するため、最初に呼び出す必要はありません。equals()Dogequals()==

2 番目の質問: ハッシュ コードの計算と の結果を変更するデータ メンバーを変更しましたequals()。これは特に規則に違反しており、その結果、マップが破損しています。その時点で、何でも起こり得ます。HashMap!のキーに変更可能なデータを持つオブジェクトを使用しないでください。

于 2013-09-01T16:40:01.787 に答える
1

これは、あなたd1=new Dog("clover")を hashmap に入れた後、その名前を によって変更するd1.name="arthur";ためarthurですnew Dog("clover")

したがって、最初にキーハッシュコードが最初にチェックされ、"clover".length等しいものとして一致し"arthur".length、これによりオブジェクトが保持されているバケットを識別できます。その後equals()、バケットから正しいオブジェクトを取得するためのチェックが実行されますが、キーが提供されたものと等しくないため、これは失敗します。

実際には、可変フィールドをハッシュコードの計算に使用することはお勧めできません。

于 2013-09-01T16:39:44.163 に答える