2012-09-14 18 views
5

Hej, używam HashMap do śledzenia usług i zgłoszeń serwisowych na tablicy BulletinBoard. Jednak muszę mieć hashcode i jest równa, ponieważ otrzymuję zduplikowane klucze. Czy ktoś może powiedzieć, dlaczego tak się dzieje?Dlaczego moja HashMap pozwala na duplikowanie kluczy?

Zawartość Keyset:

Services: [1, 1, 6, 6, 3] 
Requests: [8, 7, 6, 5, 8, 4, 5, 6, 2] 

Oto odpowiedni kod:

private static final HashMap<Advert, Integer> services = new HashMap<>(); 
... 

public class Advert { 

private int id; 
private BoardPoster poster; 

public Advert(BoardPoster poster) { 
    this.poster = poster; 
} 

public BoardPoster getPoster() { 
    return poster; 
} 

public void spawn() { 
    id = RANDOM.nextInt(ADVERT_RANGE); 
} 

public int getID() { 
    return id; 
} 

@Override 
public String toString() { 
    return Integer.toString(id); 
} 

@Override 
public boolean equals(Object o) { 
    if (o != null && o instanceof Advert) { 
     return ((Advert) o).id == id; 
    } 
    return false; 
} 

@Override 
public int hashCode() { 
    return 67 * 5 + this.id; 
} 
} 
+4

Jedna uwaga: sprawdzenie 'o! = Null && o instanceof Advert' jest zbędne. 'o instanceof Advert' zwraca' false', jeśli 'o' ma wartość' null'. W Javie 'null' nie jest uważany za typ cokolwiek, więc wszystkie instancje sprawdzają je. – Brian

+1

Ponieważ 'id' jest' int', możesz uprościć swój hashcode: 'return this.id;'. – assylias

+0

@assylias Jest to zły sposób na wykonanie kodu skrótu, ponieważ w rzeczywistości nie jest to haszowanie. zwracanie 'this.id% 1000' może być lepszym rozwiązaniem. –

Odpowiedz

18

Najbardziej prawdopodobny powód to, że obiekty używać jako klucze są zmienne. Więc jeśli zrobisz coś takiego:

map.put(anAdvert, 1); 
anAdvert.spawn(); //modifies id, which affects hashcode and equals 

Zachowanie mapy będzie nieoczekiwane.

cf Map's javadoc

Uwaga: wielki należy zachować ostrożność, jeśli Zmienne przedmioty są używane jako klucze map. Zachowanie mapy nie jest określone, jeśli wartość obiektu jest zmieniana w sposób, który wpływa na porównanie równań, podczas gdy obiekt jest kluczem na mapie.

+6

+1 dla klawisza z możliwością zmiany. – kosa

+0

Dobrą praktyką jest użycie słowa kluczowego "final" dla takich właściwości. –

+1

Nigdy nie używaj zmiennych obiektów jako klawiszy mapy! –

Powiązane problemy