V tomto příspěvku se budeme zabývat rozdílem mezi operátorem == a metodou equals() v Javě.
==
je relační operátor v Javě, který se používá k porovnávání primitivních typů, jako jsou int, double, char, float atd. Neměl by se používat k porovnávání dvou referencí na objekty, protože pro libovolné nenulové referenční hodnoty x a y vrací x == y
hodnotu true pouze tehdy, když x a y odkazují na stejný objekt.
equals()
je naopak metoda ve třídě Object
, která se používá k porovnávání objektů. Chová se podobně jako operátor ==
, pokud není třídou přepsána. Každá třída by měla přepsat metodu equals()
třídy Object
a určit vztah ekvivalence na objektech. Vztah ekvivalence by měl být takový, aby metody equals()
vyhodnocovaly porovnání hodnot v objektech bez ohledu na to, zda se oba objekty vztahují ke stejné instanci, nebo ne. Protože stejné objekty musí mít stejné hash kódy, je nutné přepsat i metodu hashCode()
.
Protože String je v Javě objekt, měli bychom pro porovnání dvou řetězců v Javě vždy používat metodu equals()
. To funguje, protože třída String
přepisuje metodu equals()
třídy Object
.
Jak je patrné z výše uvedeného programu, porovnání dvou řetězců pomocí metody ==
a equals()
vrátí rozdílný výstup. Je to proto, že metoda ==
provádí referenční porovnání, tj. porovnává, zda dvě proměnné odkazují na stejný objekt, nebo ne. Protože vytváříme dva nové objekty String
pomocí konstruktoru String
, nebudou mít stejnou referenci a s1 == s2
vrátí false. Proto bychom nikdy neměli používat operátor ==
pro porovnání dvou řetězců.
Na druhou stranu metoda equals()
třídy String
porovnává obsah zálohovaného pole znaků a jako výsledek porovnání vrací logickou hodnotu.
Níže uvedený kód však dává jiné výsledky. Je to proto, že řetězcové literály jsou uloženy ve fondu konstant String a obě s1 & s2 budou sdílet stejný odkaz. Takže s1 == s2
vrátí true.
(6 hlasů, průměr: 5,00 z 5)
Díky za přečtení.