0

名前を保存するクラスmyDemoClassと、に入れるクラスがありHashMapます。hashCode()メソッドのオーバーライドを試している間、ハッシュコードが異なっていてもHashMapが返されます。nullなんで?メソッドをオーバーライドしてhashCode()、名前の値が同じであっても、オブジェクトが異なればハッシュコードも異なるようにしました。

public class myDemoClass {

    String name;
    int value;
    static int i=1;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int hashCode()
    {
        //return name.hashCode();//now the hashcode are same
        return i++;//now the hashcode is different
    }

    public boolean equals(Object obj)
    {
        myDemoClass m=(myDemoClass)obj;
        if(obj==this)
            return true;

        if(obj instanceof myDemoClass)
        {
            return getName().equals(m.getName());
        }

        return false;
    }

}

public class Hashcodes {

    myDemoClass m1=new myDemoClass();
    myDemoClass m2=new myDemoClass();

    HashMap h=new HashMap();

    public boolean test()
    {
        m1.setName("s");
        m2.setName("s");
        System.out.println(m1.hashCode());
        System.out.println(m2.hashCode());

        h.put(m1, "a1");
        h.put(m1, "b1");

        System.out.println(h.get(m1));
        System.out.println(h.get(m2));
        System.out.println(h.get(m1));

        return true;
    }

    public static void main(String args[])
    {
        Hashcodes h=new Hashcodes();
        h.test();
    }

}

異なるハッシュコードで出力:

1
2
null
null
null

同じハッシュコードで出力:

115
115
b1
b1
b1
4

2 に答える 2

1

hashCode()関数が、hashCode()が呼び出されるたびにインクリメントされる静的フィールドを返すようにしたことに注意してください。これにより、同じオブジェクトであっても、呼び出されるたびにハッシュコードが異なります。

たとえば、次のコードがあるとします。

MyDemoClass m1 = new MyDemoClass();
m1.hashCode();
m1.hashCode();

hashCode()への最初の呼び出しは1を返し、次に静的フィールドは2にインクリメントされました。hashCode()への次の呼び出しは2を返しますが、これは前のものと同じではありませんでした。オブジェクトは個人のハッシュコードを追跡しておらず、毎回同じ静的フィールドを参照しているわけではないため、オブジェクトが同じハッシュコードを返すことはなく、HashMapは常にnull値を返します。

于 2012-07-06T19:30:55.637 に答える
0

上記の回答に同意します。静的フィールドを使用してオブジェクトの hashCode を計算することは悪い習慣です。あなたの場合、非静的フィールドのみを使用することを検討してください-実行の何が問題なのですか:
public int hashCode() { return name.hashCode() * 31 + (new Integer(value)).hashCode(); }

于 2012-07-07T11:07:51.780 に答える