s n e h m r u
i

Vertiefung - Identität und Gleichheit

Dieser Abschnitt ist als Vertiefung gedacht und für das Verständnis der folgenden Kapitel nicht zwingend notwendig. Er schärft aber das Verständnis von Referenzen und ist hilfreich, sobald man Objekte vergleichen möchte.

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