Select Page

Kotlin porovnávanie, rozdiel medzi == a ===

Jaroslav Beňo

21/05/2020

V tomto článku sa oboznámiš ako je to v Kotline s porovnávaním. Dozvieš sa aký je rozdiel medzi == a ===. Poďme na to v článku Kotlin porovnávanie, rozdiel medzi == a ===.

V Jave ak by som porovnal dve premenné pomocou ==, tak sa porovná ich hodnota. V Kotline je všetko referenčné, teda by som očakával, že ak použijem == tak sa porovnajú hodnoty, teda adresy na objekt a vtedy by dva rôzne objekty boli rôzne lebo majú inú adresu.

No nie je to tak. Znak == je štrukturálne porovnanie. Ak by som chcel porovnať referencie, tak použijem znak === čo je referenčne porovnanie.

Majme takýto príklad:

val jaro = Osoba("Jaro", "484848/4894")
val peter = Osoba("Peter", "121212/4849")

println(jaro == peter)
println(jaro === peter)

Výstup na konzole bude false a false, pretože sú to dva rôzne objekty a ani ich štruktúra nie je rovnaká.

V takomto príklade:

val peter = Osoba("Peter", "121212/4849")
val peter2 = Osoba("Peter", "121212/4849")

println(peter == peter2)
println(peter === peter2)  

Na výstupe by si očakával pre == true a pre === false, pretože majú rovnakú štruktúru a zároveň sú to dva rozdielne objekty. Na výstupe ale bude false a false.

Prečo?

Lebo na pozadí sa pri použití == volá metóda equals. Nachádza sa táto metóda v triede Osoba? Nie, tak z kade ju Kotlin zoberie? Zoberie ju z triedy Object – toto je trieda, z ktorej sú odvodené všetky ostatné triedy na pozadí.

Táto metóda equals porovnáva referencie, teda správ sa akoby sme použili ===. To ale nechceme, teda ju musíme prepísať v našej triede Osoba.

Ak začnem písať funkciu tak najprv napíšem override a keď začnem písať názov funkcie, tak nám Kotlin dá na výber:

idea kotlin 16
override fun equals(other: Any?): Boolean {
    return super.equals(other)
}  

super.equals znamená, že sa zavolá equals metóda z rodičovskej triedy a tou je Object. To chceme prepísať a vymyslíme si ako sa majú dve osoby porovnávať. To je na nás, kedy povieme, že je to tá istá osoba?

Napríklad porovnáme všetky údaje. No logicky by nám malo stačiť porovnať rodné číslo. To je už na nás.

Táto funkcia má na vstupe other, čo je typu Any – teda hocijakého typu (otáznik pri type budeme preberať pri safe type). My musíme najprv sa spýtať, či other je typu Osoba, lebo porovnávame túto Osobu s ďalšou Osobou.

override fun equals(other: Any?): Boolean {
    if(other is Osoba)
        return meno == other.meno
    else
        return false
}

K podmienkam sa ešte dostaneme.

Ak teraz spustíme program

println(peter == peter2)
println(peter === peter2)

na výstupe bude true a false. True preto, lebo som porovnal pomocou equals a false preto, lebo som porovnal referencie (odkazy na objekty v pamäti).

Ako je to s nerovnosťou? Použijeme ! pre negáciu. Napr. ak chcem porovnať, či sa premenné nerovnajú štrukturálne dáme != ak chcem porovnať, či sa dve premenné nerovnajú referenčne, tak dáme !==.

Najnovšie články

O autorovi: Jaroslav Beňo

Jaro je v skratke kresťan, manžel, otec a programátor. Na tomto webe sa venuje programovaniu. Jeho túžbou je šíriť vedomosti ďalej, aby sme mohli spolu rásť.

Pripravil viacero online video kurzov. Jeho sociálne siete:

Podobné články

Naprogramuj si vlastnú Android aplikáciu v jazyku Kotlin

V tvojej prvej Android aplikácii v Kotlime si spravíme aplikáciu na hod kockou. Stalo sa ti, že si hral človeče a chýbala ti kocka? Teraz ti postačí tvoja android appka. Verím, že telefón budeš mať po ruke skôr ako kocku :). Tlačidlo Layout vieme písať aj ručne....

Kotlin extension functions

Predstav si, že chceš manipulovať so stringom. Máš text, ktorý chceš upraviť, napríklad každé druhé písmeno chceš dať veľkým písmenom. Každé prvé bude malým. Máš takúto metódu v Stringu? Nie. Teda nie je možné zavolať napríklad: "Lorem ipsum dolor sit amet,...

Kotlin funkcie

Ak je funkcia vo vnútri triedy, tak sa označuje ako metóda alebo member funkcia – ale je to v podstate jedno. Začíname so slovom fun. Potom ide názov a nasledujú argumenty. Ak metóda nič nevracia, tak na pozadí vracia typ Unit. Ak metóda vracia nejakú...

Kotlin Data class

Ak potrebuješ uchovávať stav aplikácie. Teda máš premenné a potrebuješ ich nastavovať a získavať ich hodnoty, tak vieš použiť Data class. Máme triedu Auto: class Auto (val nazov: String, val pocetDveri: Int = 4) { } Ako z nej spravím data class?...

Kotlin triedy a konštruktory

Trieda slúži na opis a výrobu objektov. Skúsme porozmýšľať nad reálnym objektom – napríklad auto. Ak chceme opísať auto do programu, tak na opis auta použijeme triedu. Čo má auto? Aké vlastnosti? Má počet dverí, značku, ečv, objem kufra a ďalších xy vecí. Nie...

Kotlin range

Range ako názov hovorí je rozpätie hodnôt. V tomto článku sa pozrieme na to ako Kotlin pracuje s range. Poďme sa pozrieť na príklady. Použitie v podmienke: if (i in 1..4) { // equivalent of 1 <= i && i <= 4 print(i) } Prechádzanie cez hodnoty rangu:...

Kotlin dátové typy

Java a Kotlin sú zameniteľné jazyky. Vieš ich obidva použiť v jednom programe, pretože nakoniec z nich bude .class súbor. Tým pádom typy, ktoré pozná Kotlin, pozná aj Java. Sú rozdiely, ktoré už vieš. Nevieš napísať typ int, ale vieš ho používať...

Kotlin String templates

Pri vypisovaní textu často ku textu pridávame hodnoty z premenných. Spájanie Stringov vieme spraviť pomocou + kde pospájame hodnoty a Stringy: for((i, v) in mena.withIndex()){ print("" + i + " " + v + "\n") } Kotlin ale má krajšiu cestu: for((i, v) in...

Kotlin for cyklus

Cyklus alebo loop znamená, že niečo sa opakuje xy krát. Možno prechádzame čísla od 1 do 100, alebo prechádzame cez elementy v poli alebo liste. V tomto článku sa dozvieš ako použiť for cyklus. Predstav si, že chceš vypísať čísla od 0 do 10. Použijeme for cyklus...

Kotlin polia

Pole je zoskupenie jeden a viac prvkov. Na vytvorenie poľa použijeme funkciu arrayOf. Do pola môžeme dať hodnoty rôzneho typu. val mena = arrayOf("Jaro", "Peter"); val rozne = arrayOf("Jaro", 10, Osoba("Tomas", "145878/8787"), false, "Peter"); Aj miešame typy...

Share This

Páčil sa ti článok? Zváž zdieľanie. Ďakujeme.