2016-03-25 19 views
1

Eğer bu temel bir şey olmasından dolayı özür dilerim ama java'yı başlatıyorum ve bu herhangi bir ödev değil, neden basit test programım başarısız oluyor?HashMap acemi programcı, neden programımda false döndürüyor içerdi

static public class pair 
{ 
    public int x; 
    public int y; 
    public pair(int a , int b) 
    { 
     x = a; 
     y = b; 
    } 
} 
public static void main(String args[]) 
{ 
    HashMap<pair,Integer>m = new HashMap<pair,Integer>(); 
    m.put(new pair(1,2), 3); 
    if(m.containsKey(new pair(1,2))) 
    { 
     System.out.println("is there " + m.get(new pair(1,2))); 
    } 

} 
+1

Bu benzer bir soru: http://stackoverflow.com/questions/12774723/calling-containskey-on-a-hashmap-with-custom-class?rq=1 –

+2

Eğer "eşittir" geçersiz kılmadıysanız ve 'hashCode' sonra her nesnenin farklı olduğunu söylüyorsunuz. –

+1

Sadece Java ile başlıyorsanız, Java kod stili https://google.github.io/styleguide/javaguide.html –

cevap

4

Açıkça görülüyor ki, hatalı adlandırılmış çift sınıfınızda eşittir ve hashCode'u geçersiz kılmamışsınızdır.

Joshua Bloch'un "Etkin Java" bölüm 3'ü, düzgün bir şekilde nasıl yapılacağını görmek için okuyun.

Derin ve sığ eşitlikler arasındaki fark bu. Eşitlemeyi geçersiz kılmadığınızda, nesne referanslarını karşılaştırırsınız. Aynı veriler içeren iki örneğinize yapılan referanslar farklıdır; onlar sığ eşit değildir.

new pair(1,2).equals(new pair(1,2)) // returns false 
new pair(1,2) == new pair(1,2) // returns false 

Sınıfın içeriğini karşılaştırmak için eşitliği geçersiz kıldığınızda, düzgün bir şekilde yaptığınız takdirde bir şansınız olur.

new pair(1,2).equals(new pair(1,2)) // will return true after override 
new pair(1,2) == new pair(1,2) // returns false 

bilgi ve Java kodlama standartları izleyin: Pair değil pair olmalıdır.

Sizin Pair sınıf jenerik olarak daha faydalı olacaktır:

public class Pair<U, V> { 
    public final U u; 
    public final V v; 

    public Pair<U, V>(U foo, V bar) { 
     this.u = foo; 
     this.v = bar; 
    } 

    // override equals and hashCode 

} 

JDK8 bir Pair sınıf var mı? İlginç tartışmalar here.