Objekt třídy Person
nese informace o člověku.
Zde dva objekty položíme stejné (rovnocenné),
nesou-li stejná příjmení.
==
, !=
<
, <=
, >=
, >
— ani to nelze dodefinovat jako
v C++
.
Warning
|
|
==
Použití ==
na objekty:
==
dostaneme rovnost jen v případě, jedná-li se o dva odkazy na
tentýž objekt — tj. dva totožné objekty.
==
vrátí false
.
equals
, která musí vrátit true
,
právě když se obsah výchozího a srovnávaného objektu rovná.
equals
lze srovnat s porovnáváním dvou databázových záznamů
podle primárního klíče.
equals
, funguje původní equals
přísným způsobem,
tj. rovné si budou jen totožné objekty .
Objekt třídy Person
nese informace o člověku.
Zde dva objekty položíme stejné (rovnocenné),
nesou-li stejná příjmení.
public class Person { private String firstname; private String surname; public Person (String j, String p) { firstname = j; surname = p; } public boolean equals(Object o) { if (o instanceof Person) { Person c = (Person)o; // dva lidé se rovnají, mají-li stejná příjmení return surname.equals(c.surname); } else { // porovnáváme-li osobu s ne-osobou... return false; } } }
hashCode
equals
vyvstává jeden dosud nezaznamenaný problém.
equals
, měli bychom současně překrýt
i metodu hashCode
. Tato metoda vrací celé číslo (int
) co nejlépe
charakterizující obsah objektu tak, aby:
equals
) objekty musí vždy vrátit stejnou hodnotu.
hashCode
naopak měla vracet
různé hodnoty, což ale není stoprocentně nezbytné a ani nemůže být vždy splněno.
Note
|
Metoda |
hashCode
hashCode
námi definované třídy s oblibou delegujeme řešení
na volání hashCode
jednotlivých složek našeho objektu
equals
. Rozšíříme minulý příklad.
public class Person { private String firstname; private String surname; public Person (String firstname, String surname) { this.firstname = firstname; this.surname = surname; } public boolean equals(Object o) { // zde zůstává porovnání příjmení } // nyní ale doplňujeme překrytí hashCode public int hashCode() { // které využívá volání hashCode na příjmení, // protože jedině příjmení využíváme v equals return surname.hashCode(); } }