2016-03-29 19 views
1

クラスAの2つのオブジェクトの値が同じeleの場合、その2つのオブジェクトは等しいです。だから私はオブジェクトのele(どこでもsの値を考慮していない)を返すtoStringとhashCodeをオーバーライドしました。Java - hashCodeとtoStringのオーバーライド

public class A { 
    private int ele; 
    private String s; 

    public int getEle() { 
     return ele; 
    } 

    public void setEle(int ele) { 
     this.ele = ele; 
    } 

    public String getS() { 
     return s; 
    } 

    public void setS(String s) { 
     this.s = s; 
    } 

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

    @Override 
    public String toString() { 
     return String.valueOf(ele); 
    } 
} 

public static void main(String[] args) { 

    Map<A, String> map = new HashMap<>(); 
    A a1 = new A(); 
    a1.setEle(10); 
    a1.setS("abc"); 

    A a2 = new A(); 
    a2.setEle(10); 
    a2.setS("efg"); 

    map.put(a1, "val1"); 
    map.put(a2, "val2"); 

    System.out.println(map.get(a1)); 
    System.out.println(map.get(a2)); 

} 

出力:

val1 
val2 

しかし、私はマップにa1a2の値を入れた場合、私は両方のmap.get(a1)のために返されるval1val2のいずれかを期待していましたおよびmap.get(a2)

答えて

7

確かに、a1a2は、同じハッシュコードを持っていますが、あなたが等しくなるように同じeleを持つ2つのAオブジェクトを検討するequalsをオーバーライドしていなかったため、彼らは等しいと見なされていませんでした。マップは、ハッシュコードを使用した後、等級について最終ルーラーにequalsを使用します。マップは両方のオブジェクトを同じバケットに配置しますが、等しくないため、両方のオブジェクトを保持します。

上書きequalsように他の物体がAであり、それらの両方が同じeleを持っている場合、それはtrueを返します。その後、val2は、両方のgetコールのために返されることがわかります。

+0

ああ..私の悪い。私はそれがtoStringを使用して文字列表現を取得し、次にそれを比較すると思った – Ashwin

+0

しかし、私はチェーン時にリストを使用すると思います。しかし、まずval1に入る。しかし、私は両方のためにval2を取得します。どうして? – Ashwin

+0

マップに 'a2'を' put 'すると、 'equals'が' true'を返すのでマップは 'a1'と同じと見なします。マップはそこにあるキーと値のペア( 'Entry')、' a1 - > "val1" 'を' a2' - > "val2"と置き換えます。どちらの 'get'呼び出しでも' equals'が 'true'を返すので、毎回現在の値' 'val2''が取得されます。 – rgettman

0

newキーワードを使用するたびに、objectheapというメモリを新規作成します。だから、a1a2の両方が、実際には別のオブジェクトです。

すなわち、マップに追加する際に考慮ele値を取るために詳細はあなたが等号を(実装する必要がおよそnewキーワードWhat New keyword do Internally in Java

1

を)これを参照してください。

public class A { 

    private int ele; 
    private String s; 

    public int getEle() { 
     return ele; 
    } 

    public void setEle(int ele) { 
     this.ele = ele; 
    } 

    public String getS() { 
     return s; 
    } 

    public void setS(String s) { 
     this.s = s; 
    } 

    @Override 
    public boolean equals(Object o) { 
     if (this == o) return true; 
     if (o == null || getClass() != o.getClass()) return false; 

     A a = (A) o; 

     return ele == a.ele; 

    } 

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

これはあなたを行います必要に応じて1つの値だけを返します。

関連する問題