s n e h m r u
i

Vertiefung - Identität und Gleichheit

Zwei Fragen beim Vergleichen

Wenn man zwei Objekte vergleicht, kann man zwei verschiedene Dinge meinen:

  • Identität: Sind das wirklich ein und dasselbe Objekt (also dieselbe Referenz)?
  • Gleichheit: Sind es zwei Objekte mit gleichem Inhalt?

Kotlin bietet dafür zwei Operatoren:

=== prüft die Identität: Verweisen beide Variablen auf dasselbe Objekt?
== prüft die Gleichheit: Haben die Objekte den gleichen Inhalt? (== ruft dazu die Methode equals auf.)

Eigene Klassen

Für selbst geschriebene Klassen wie Figur ist equals standardmäßig nicht festgelegt – deshalb vergleicht == hier ebenfalls die Identität, verhält sich also wie ===.

class Figur(val farbe: String, var x: Int, var y: Int)

fun main() {
    val a = Figur("blau", 0, 0)
    val b = Figur("blau", 0, 0)   // gleiche Werte, aber ein eigenes Objekt
    val c = a                     // dasselbe Objekt wie a

    println(a === b)   // ?
    println(a === c)   // ?
    println(a == b)    // ?
}

Zwei Figuren mit denselben Werten sind also trotzdem verschieden, solange es zwei getrennte Objekte sind.

Zeichenketten

Bei String ist equals sinnvoll vorbelegt: == vergleicht den Inhalt der Zeichenketten. Das ist fast immer das, was man möchte.

fun main() {
    val s1 = "Hallo"
    val s2 = "Hal" + "lo"

    println(s1 == s2)    // ?  vergleicht den Inhalt
    println(s1 === s2)   // ?  vergleicht die Identität (selten benötigt)
}
Das ist eine angenehme Stärke von Kotlin: == vergleicht bei Strings den Inhalt. In manchen anderen Sprachen (z.B. Java) vergleicht == bei Objekten die Identität – dort führt der Vergleich von Zeichenketten mit == leicht zu Fehlern. In Kotlin benutzt du für inhaltliche Vergleiche einfach ==.

Aufgabe 1 - Vorhersagen

Sage für beide Programme die Ausgaben voraus und überprüfe sie anschließend. Erkläre jeweils den Unterschied zwischen == und ===.

Suche

v
100.123.5.2 Vertiefung - Identität und Gleichheit
Kopieren durch Anklicken

Rückmeldung geben