2011. március 6., vasárnap

Equals és a hashCode

public boolean equals(Object obj)

  • ellenőrzi, hogy egy másik objektum egyenlő-e azzal az objektummal, amire ezt a metódust meghívtuk
  • az alapértelmezett implementáció azt ellenőrzi, hogy két objektum referenciája azonos-e (x==y), ezt hívjuk sekély hasonlításnak (shallow comparison)
  • azon osztályok, melyek felüldefiniálják ezt a metódust, mély hasonlítást (deep comparison) kell használniuk, azaz minden egyes releváns adatát össze kell hasonlítani az objektumnak
Az equals tulajdonságai:
  • reflexív
  • szimmetrikus
  • tranzitív
  • konzisztens (ha két objektum egyenlő, akkor amíg nem módosulnak, egyenlőnek kell maradniuk)
  • null összehasonlítás biztos (ha null az objektum, amivel összehasonlítjuk, mindig hamisat kell visszaadni)
  • ha két objektum egyenlő, hashCode-juk is azonos kell legyen

public int hashCode()

  •  az adott objektum hash kódjának egész számú reprezentációját adja vissza
  • a hash alapú collecition-ök (HashTable, HashMap stb.) használják
  • minden osztály, ami az equals() metódust felüldefiniálja, a hashCode() metódust is felül kell, hogy definiálja

A hashCode() tulajdonságai:
  • konzisztens 
  • ha két objektum egyenlő az equals() metódus szerint, hash kódjuk is azonos kell legyen
  • ugyanazzal a hash kóddal rendelkező objektumok lehetnek különbözőek
Ugyan nem megkövetelt, de célszerű úgy programozni, hogy különböző objektumoknak különböző legyen a hash kódja is, ezzel javítunk az általunk implementált típusú objektumokat tartalmazó, hash alapján működő collection-ök teljesítményén.

Összefoglalás

Ami nagyon fontos, és el szokott siklani a figyelme sokaknak e felett:

Ha két objektum azonos (egyenlő), ugyanazt a hash kódot kell adniuk is, de fordítva ez nem igaz, azaz ha két objektum azonos hash kóddal rendelkezik, attól még nem biztos, hogy egyenlőek is.



Irodalom:
Java 1.5 API

Nincsenek megjegyzések:

Megjegyzés küldése