Any.toString în Kotlin

Comparare și timp Kotlin 1.0

toString dă textul unui obiect (folosit de println și de templates); hashCode dă un număr folosit de HashMap și HashSet.

Sintaxă
open fun toString(): String
open fun hashCode(): Int
open operator fun equals(other: Any?): Boolean

Ce face Any.toString

Orice clasă din Kotlin moștenește din Any trei funcții: toString(), hashCode() și equals(). toString() returnează textul obiectului și este apelată automat de println și de string templates. Implicit dă ceva de forma Produs@1b6d3586 (numele clasei și un număr), așa că o suprascrii cu override fun toString().

hashCode() returnează un număr întreg calculat din conținutul obiectului. HashMap și HashSet îl folosesc pentru a găsi repede elementele. Regula: două obiecte egale după equals trebuie să aibă același hashCode. Dacă suprascrii una dintre ele, suprascrie-le pe amândouă.

Clasele data primesc automat toString, equals și hashCode după proprietățile din constructor, așa că de obicei nu le mai scrii de mână.

Ce returnează

toString: un String. hashCode: un Int.

Exemple

Exemplul 1: Suprascrierea lui toString

println și template-ul folosesc automat textul dat de toString. Clasa data are deja o variantă generată.

class Produs(val nume: String, val pret: Double) {
    override fun toString() = "$nume – $pret lei"
}

data class Oras(val nume: String, val judet: String)

fun main() {
    val p = Produs("cafea", 24.5)
    println(p)
    println("În coș: $p")
    println(p.toString().length)
    println(Oras("Iași", "IS"))
    println(42.toString() + "!")
}

Rezultat

cafea – 24.5 lei
În coș: cafea – 24.5 lei
16
Oras(nume=Iași, judet=IS)
42!

Exemplul 2: hashCode la obiecte egale

Două obiecte data cu aceleași valori sunt egale și au același hashCode, deci HashSet le păstrează o singură dată. Pentru texte, hashCode este același la fiecare rulare.

data class Student(val nume: String, val grupa: Int)

fun main() {
    val a = Student("Ana", 101)
    val b = Student("Ana", 101)
    println(a == b)
    println(a.hashCode() == b.hashCode())
    println(hashSetOf(a, b, Student("Ion", 102)).size)
    println("Ana".hashCode())
}

Rezultat

true
true
2
65972

Greșeli frecvente

  • Suprascrii equals într-o clasă obișnuită, dar nu și hashCode. Obiectele egale ajung de două ori într-un HashSet. Suprascrie-le împreună sau folosește data class.
  • Te bazezi pe hashCode ca identificator unic. Două obiecte diferite pot avea același hashCode.
  • Afișezi un obiect obișnuit și primești Produs@1b6d3586. Adaugă override fun toString().

Comenzi înrudite

  • println: Afișează o valoare pe ecran: println trece apoi la rând nou, print rămâne pe același rând.
  • Comparable.compareTo: compareTo compară două obiecte și dă un număr negativ, 0 sau pozitiv; compareValues face la fel și acceptă null.