Rozdíl mezi == a equals() v Javě

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í.

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna.