W tym poście omówimy różnicę między == operatorem i metodą equals() w Javie.
==
jest operatorem relacyjnym w Javie, który jest używany do porównywania typów prymitywnych, takich jak int, double, char, float, itp. Nie powinien być używany do porównywania dwóch referencji obiektów, ponieważ dla dowolnych nie-null wartości referencyjnych x i y, x == y
zwraca true tylko wtedy, gdy x i y odnoszą się do tego samego obiektu.
equals()
, z drugiej strony jest metodą w klasie Object
, która jest używana do porównywania obiektów. Zachowuje się ona podobnie do operatora ==
, jeśli nie jest nadpisana przez klasę. Każda klasa powinna nadpisać metodę equals()
klasy Object
i określić relację równoważności na obiektach. Relacja równoważności powinna być taka, że metoda equals()
ocenia porównanie wartości w obiektach niezależnie od tego, czy dwa obiekty odnoszą się do tej samej instancji, czy nie. Ponieważ równe obiekty muszą mieć równe kody hash, konieczne jest również nadpisanie metody hashCode()
.
Ponieważ String jest obiektem w Javie, powinniśmy zawsze używać metody equals()
do porównywania dwóch łańcuchów w Javie. Działa to, ponieważ klasa String
nadpisuje metodę equals()
klasy Object
.
Jak wynika z powyższego programu, porównywanie dwóch ciągów za pomocą metody ==
i equals()
zwraca różne dane wyjściowe. Dzieje się tak, ponieważ ==
wykonuje porównanie referencyjne, tj. porównuje, czy dwie zmienne odnoszą się do tego samego obiektu, czy nie. Ponieważ tworzymy dwa nowe obiekty String
za pomocą konstruktora String
, nie będą one miały tego samego odniesienia i s1 == s2
zwraca wartość false. Dlatego nigdy nie powinniśmy używać operatora ==
do porównywania dwóch łańcuchów.
Z drugiej strony, metoda equals()
klasy String
porównuje zawartość tablicy backed char i zwraca wartość boolean jako wynik porównania.
Jednakże poniższy kod daje inne wyniki. Dzieje się tak, ponieważ literały String są przechowywane w stałej puli String, a oba s1 & s2 będą dzielić to samo odniesienie. Tak więc s1 == s2
zwraca true.
(6 głosów, średnia: 5.00 na 5)
Dziękuję za przeczytanie.
.