Objekt třídy Person
nese informace o člověku.
Zde dva objekty položíme stejné (rovnocenné),
nesou-li stejná příjmení.
==
(rovná se), !=
(nerovná se)
double
, float
)
je většinou třeba porovnávat s určitou tolerancí,
tzn. brát za rovná čísla odlišná o méně než jisté delta
<
, <=
, >=
, >
boolean
, tzn. není určeno,
zda false < true
==
vrací true
právě při rovnosti odkazů,
neboli když oba odkazy ukazují na přesně tentýž objekt, tj. jsou-li
objekty identické. Odkazy obsahují tutéž adresu objektu.
tedy jakási rovnocennost, rovnost obsahu, ekvivalence objektů
se zjišťuje voláním metody o1.equals(Object o2)
==
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
S překrytím metody equals
vyvstává jeden dosud nezmíněný 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: — pro dva stejné (dle equals
) objekty musí vždy vrátit stejnou hodnotu. — Pro dva obsahově různé objekty by 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(); } }