2016-03-29 18 views
1

İki nesne A sınıfında ele ile aynı değere sahipse, o zaman bu iki nesne eşittir. Bu yüzden nesnenin ele'unu (her yerde s değerini dikkate almadan) döndürmek için String ve hashCode'a geçersiz kıldım. Java - hashCode ve toString'i geçersiz kılma


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)); 

} 

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); 
    } 
} 
Çıktı:

val1 
val2 

Ama bir harita içinde a1 ve a2 değerini koyarsanız, ben bekliyordum ya val1 veya val2 hem map.get(a1) için iade edilecek ve map.get(a2).

cevap

7

Tabii, a1 ve a2 aynı hash kodu var, ancak eşit olması aynı ele iki A nesneleri dikkate almak equals geçersiz yoktu çünkü onlar eşit olarak kabul edilmedi. Bir harita, karma kodunu kullandıktan sonra, son cetvele equals eşitliğini kullanır. Harita, her iki nesneyi aynı kovaya yerleştirecektir, ancak eşit olmadıklarından, her ikisini de koruyacaktır.

geçersiz kılma equals bu şekilde diğer bir amacı, bir A ve her ikisi de aynı ele varsa true döndürür. Ardından, val2'un hem get çağrıları için döndüğünü göreceksiniz.

+0

Oh ya .. Benim kötü. String temsilini almak ve sonra – Ashwin

+0

'u karşılaştırmak için toString kullandığını düşündüm Ama sanırım zincirleme yaparken bir liste kullanıyor. Ama ben ilk val1 giriyorum. Ama ikisine de val2 veriyorum. Niye ya? – Ashwin

+0

Haritaya a2'yi koyduğunuzda, harita "a1" ile eşit olduğunu düşünür, çünkü "eşittir" gerçek değerini döndürür. Harita, o zaman, "a1 ->" val1 "," a2 "->" val2 "ile bulunan anahtar-değer çiftini (bir" Giriş ") _replaces_. İkiniz de 'get' çağrılarınız 'equals'' true' döndürerek sonuçlanır, böylece mevcut değer, 'val2' 'her seferinde alınır. – rgettman

0

new anahtar sözcüğünü her kullandığınızda, heap Bellek içinde yeni bir object yapar. Yani, a1 ve a2 her ikisi de farklı Nesnelerdir.

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; 
    } 
} 

Bu sizi yapacaktır:

What New keyword do Internally in Java

1

Sen equals() bir haritaya eklerken yani dikkate ele değerini almak için uygulanması gereken new anahtar kelime hakkında daha fazla bilgi için bu bakınız lütfen İstediğiniz gibi sadece bir değer döndürün.