Tässä postauksessa keskustelemme ==-operaattorin ja equals()-metodin erosta Javassa.
==
on relaatio-operaattori Java-ohjelmassa, jota käytetään primitiivisten tyyppien, kuten int:n, double:n, char:n, float:n jne. vertailuun. Sitä ei pitäisi käyttää kahden objektiviittauksen vertailuun, sillä mille tahansa ei-null-viitearvoille x ja y x == y
palauttaa true-arvon vain silloin, kun x ja y viittaavat samaan objektiin.
equals()
taas on Object
-luokan metodi, jota käytetään objektien vertailuun. Se käyttäytyy samalla tavalla kuin ==
-operaattori, jos luokka ei ole ohittanut sitä. Jokaisen luokan tulisi ohittaa Object
-luokan equals()
-metodi ja määrittää objektien vastaavuussuhde. Ekvivalenssisuhteen tulisi olla sellainen, että equals()
-metodit evaluoivat objektien arvojen vertailun riippumatta siitä, viittaavatko kaksi objektia samaan instanssiin vai eivät. Koska yhtäläisillä objekteilla on oltava yhtäläiset hash-koodit, on tarpeen ohittaa myös hashCode()
-metodi.
Sen vuoksi, että String on Javassa objekti, meidän tulisi aina käyttää equals()
-metodia kahden merkkijonon vertailuun Javassa. Tämä toimii, koska String
-luokka ohittaa Object
-luokan equals()
-metodin.
Kuten yllä olevasta ohjelmasta käy ilmi, kahden merkkijonon vertailu ==
– ja equals()
-metodin avulla palauttaa eri tuloksen. Tämä johtuu siitä, että ==
suorittaa viittausvertailun eli vertaa, viittaavatko kaksi muuttujaa samaan objektiin vai ei. Koska luomme kaksi uutta String
-objektia käyttäen String
-konstruktoria, niillä ei ole samaa viittausta ja s1 == s2
palauttaa false. Näin ollen meidän ei pitäisi koskaan käyttää ==
-operaattoria kahden merkkijonon vertailuun.
Toisaalta String
-luokan equals()
-metodi vertaa taustoitetun char-määritteen sisältöä ja palauttaa vertailun tuloksena boolean-arvon.
Alhaalla oleva koodi antaa kuitenkin erilaiset tulokset. Tämä johtuu siitä, että String-litteraalit tallennetaan String-vakiovarastoon, ja molemmat s1 & s2 jakavat saman viittauksen. Joten s1 == s2
palauttaa true.
(6 ääntä, keskiarvo: 5.00 5:stä)
Kiitos, että luit.