Ero == ja equals() välillä Javassa

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.

Vastaa

Sähköpostiosoitettasi ei julkaista.