İ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)
.
Oh ya .. Benim kötü. String temsilini almak ve sonra – Ashwin
'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
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