In Kotlin werden neben den relativ starren Datenstrukturen wie Arrays auch weitere deutlich flexiblere Datenkonstrukte verwendet – die sogenannten Collections. Kotlin-Collections sind generische Datenstrukturen, die zum Speichern und Verwalten einer Gruppe von Objekten desselben Typs verwendet werden. Sie bieten eine Vielzahl von Methoden und Funktionen, um auf die gespeicherten Elemente zuzugreifen, sie zu manipulieren, hinzuzufügen oder zu entfernen.

Collections sind keine Besonderheit oder Erfindung von Kotlin, sondern ein grundlegendes Konzept in vielen Programmiersprachen. Java bietet eine Collection-API an, die aus zahlreichen Interfaces und Klassen besteht, um verschiedene Arten von Sammlungen zu unterstützen. Kotlin baut auf dieser Java Collection-API auf und erweitert sie, um die Arbeit mit Collections einfacher und sicherer zu gestalten.

Zu den wichtigsten Collection-Typen in Kotlin gehören List, Set und Map.

List

List: Eine Liste ist eine geordnete Sammlung von Elementen. Sie kann doppelte Elemente enthalten und ihre Reihenfolge bleibt erhalten. In Kotlin wird eine Liste durch das Interface List repräsentiert. Eine Liste kann mit der Funktion listOf() erstellt werden. Zum Beispiel:

Anwendungsfälle: Listen werden verwendet, wenn die Reihenfolge der Elemente wichtig ist und Duplikate erlaubt sind. Zum Beispiel Speichern von Elementen in der Reihenfolge, in der sie auftreten (z. B. eine Liste von Benutzern, die sich für einen Newsletter anmelden).

Set

Set: Ein Set ist eine Sammlung von einzigartigen Elementen. Es enthält keine Duplikate und die Reihenfolge der Elemente ist nicht garantiert. In Kotlin wird ein Set durch das Interface Set repräsentiert. Ein Set kann mit der Funktion setOf() erstellt werden. Zum Beispiel:

Anwendungsfälle: Sets kommen zum Einsatz, wenn Duplikate nicht zugelassen werden sollen und die Anordnung der Elemente keine Rolle spielt. Beispielsweise kann eine Ansammlung von einzigartigen Elementen, wie einer Auflistung von Benutzernamen oder E-Mail-Adressen, verwendet werden. Sets eignen sich für rasche Mitgliedschaftsprüfungen, etwa um festzustellen, ob ein Element innerhalb einer Gruppe enthalten ist.

Map

Map: Eine Map ist eine Sammlung von Schlüssel-Wert-Paaren. Jeder Schlüssel ist eindeutig und mit einem Wert verknüpft. In Kotlin wird eine Map durch das Interface Map repräsentiert. Eine Map kann mit der Funktion mapOf() erstellt werden. Zum Beispiel:

Anwendungsfälle: Maps werden verwendet, wenn Elemente in Form von Schlüssel-Wert-Paaren angeordnet sind und jeder Schlüssel einzigartig ist. Ein Beispiel hierfür ist das Speichern von Benutzerinformationen, bei denen der Benutzername oder die E-Mail-Adresse als Schlüssel fungiert und die zugehörigen Benutzerdaten als Werte abgelegt werden. Maps eignen sich effizient für schnelle Suchvorgänge, beispielsweise um einen Wert anhand eines eindeutigen Schlüssels zu ermitteln.

Immutable (read-only) und mutable Collections

Kotlin unterscheidet zwischen unveränderlichen (immutable oder auch read-only genannt) und veränderlichen (mutable) Collections. Unveränderliche Collections können nach ihrer Erstellung nicht mehr verändert werden, während veränderliche Collections Methoden zum Hinzufügen, Entfernen und Ändern von Elementen bieten. Bildlich gesprochen lässt sich das wie folgt vorstellen: Unveränderliche Collections sind wie gedruckte Bücher – sie können nicht verändert werden, nachdem sie erstellt wurden. Veränderliche Collections hingegen sind wie Notizbücher, in denen wir Dinge hinzufügen, ändern oder löschen können.

Zu den immutable Collections gehören die oben genannten List, Set und Map.

Die mutable Collections können nach ihrer Erstellung geändert werden. Die Interfaces MutableList, MutableSet und MutableMap erweitern die entsprechenden Basisschnittstellen und fügen Methoden zum Hinzufügen, Entfernen und Ändern von Elementen hinzu.

MutableList

MutableList wird in Kotlin verwendet, um eine dynamische, veränderliche Liste von Elementen zu repräsentieren, bei denen die Reihenfolge der Elemente wichtig ist. Zur Erstellung der mutablen Collection MutableList wird die Funktion mutableListOf() verwendet. In dem nachfolgenden Beispiel wird eine veränderliche Liste erstellt und anschließend mithilfe von Standardfunktionen geändert.

Anwendungsbeispiel: Sammeln und Verarbeiten von Daten aus verschiedenen Quellen, die anschließend weiterverarbeitet oder analysiert werden müssen, z. B. beim Einlesen von Daten aus einer Datei oder einer Datenbank, bei der Verarbeitung von API-Antworten oder bei der Manipulation von Daten für statistische Analysen.

MutableSet

MutableSet wird in Kotlin verwendet, um eine veränderliche Sammlung von einzigartigen Elementen zu repräsentieren, bei denen Duplikate unerwünscht sind. Um MutableSet zu erstellen, wird die Funktion mutableSetOf() verwendet. 

Anwendungsbeispiel: Verwaltung von Beziehungen zwischen Objekten oder Elementen in einer Anwendung, wie zum Beispiel das Speichern von „Gefällt mir“-Interaktionen in einer Social-Media-Anwendung, bei denen jeder Benutzer nur einmal „Gefällt mir“ klicken kann.

MutableMap

MutableList wird zum Speichern von Schlüssel-Wert-Paaren verwendet, bei denen jeder Schlüssel eindeutig ist und Werte geändert, hinzugefügt oder entfernt werden müssen. 

Anwendungsbeispiel: MutableMaps eignen sich gut für Situationen, in denen schneller Zugriff auf Werte basierend auf eindeutigen Schlüsseln erforderlich ist. Beispiele hierfür sind das Speichern von Benutzerinformationen, bei denen der Benutzername oder die Benutzer-ID als Schlüssel und die zugehörigen Benutzerdaten als Wert dienen, oder das Speichern von Konfigurationseinstellungen in einer Anwendung, bei denen die Einstellungsnamen die Schlüssel und die Einstellungswerte die zugehörigen Werte sind.

Kotlin-Collections bieten neben bereits erwähnten Funktionen eine Reihe von weiteren Methoden für Transformationen, Filtern, Sortieren und Gruppieren, wie map, filter, groupBy, sortedBy und viele mehr. Diese Funktionen erleichtern das Arbeiten mit Collections und machen den Code einfacher und ausdrucksstärker. Im weiteren Verlauf werden die Funktionen detailliert betrachtet.

Collection-Hierarchie

Die Collection-Hierarchie beschreibt, wie Sammlungsklassen und -Interfaces in einer hierarchischen Anordnung organisiert sind. Diese Anordnung beinhaltet verschiedene Interfaces, die sowohl allgemeine als auch spezifische Funktionen für unterschiedliche Sammlungstypen bereitstellen. Auf diese Weise können diverse Sammlungstypen auf eine einheitliche und gut strukturierte Art und Weise verwendet und erweitert werden.

Folgende Tabelle gibt einen Überblick über die wichtigsten Interfaces in der Collection-Hierarchie und ihre Beziehungen zueinander. Jedes Interface stellt einen bestimmten Collection-Typ dar, und die Untergeordneten Interfaces erweitern die Fähigkeiten ihrer übergeordneten Interfaces, um zusätzliche Funktionen oder Veränderlichkeit zu ermöglichen.

Interface Beschreibung Untergeordnete Interfaces Beispiele
Collection Dies ist das Haupt-Interface für alle Collection-Typen. Es bietet grundlegende Funktionen wie size(), isEmpty(), contains(), etc. Alle anderen Collection-Interfaces erweitern dieses Interface List, Set ArrayList, HashSet, LinkedList
List Ein geordneter Collection-Typ, der Duplikate zulässt und den Zugriff auf Elemente über einen Index ermöglicht. List erweitert das Collection-Interface. MutableList ArrayList, LinkedList
MutableList Geordnete Sammlung, die Duplikate erlaubt und veränderlich ist ArrayList, LinkedList
Set Ungeordnete Sammlung, die keine Duplikate erlaubt MutableSet HashSet, LinkedHashSet
MutableSet Ungeordnete Sammlung, die keine Duplikate erlaubt und veränderlich ist HashSet, LinkedHashSet
Map Ein Collection-Typ, der Elemente in Schlüssel-Wert-Paaren organisiert. Map ist kein direktes Sub-Interface von Collection, sondern bildet eine separate Hierarchie, die jedoch eng mit der Collection-Hierarchie verknüpft ist. MutableMap HashMap, LinkedHashMap
MutableMap Sammlung von Schlüssel-Wert-Paaren, die veränderlich ist HashMap, LinkedHashMap
Map.Entry Ein Schlüssel-Wert-Paar in einer Map

Unterschiede und Ähnlichkeiten zwischen Arrays und Collections

Arrays und Collections haben mehrere Unterschiede und Ähnlichkeiten in Bezug auf Funktionalität, Verwendung und Leistung. Nachstehend sind einige der Hauptunterschiede zwischen Arrays und den Collection-Typen List, Set und Map in Kotlin:

Größe und Änderbarkeit: 

  • Arrays haben eine feste Größe, die bei der Erstellung festgelegt wird und sich nicht ändert. Man kann Elemente innerhalb eines Arrays ändern, aber man kann seine Größe ändern.
  • Collections können je nachdem, ob sie unveränderlich (read-only) oder veränderlich (mutable) sind, unterschiedliche Größenänderungsverhalten aufweisen. Mutable Collections (z. B. MutableList, MutableSet, MutableMap) können wachsen oder schrumpfen, während Readonly Collections (List, Set, Map) ihre Größe nach der Erstellung nicht ändern können.

Typ-Hierarchie:

  • Arrays sind keine Teilnehmer der Collection-Hierarchie und implementieren nicht die Collection-Interfaces List, Set oder Map.
  • List, Set und Map sind Teil der Collection-Hierarchie und implementieren die Collection-Interfaces in Kotlin.

Speicherung von Elementen:

  • Arrays speichern Elemente in einem kontinuierlichen Speicherbereich und ermöglichen schnellen direkten Zugriff auf Elemente über ihren Index.
  • Collections speichern Elemente möglicherweise nicht in einem kontinuierlichen Speicherbereich, je nach ihrer internen Implementierung. Die Leistung bei Zugriff und Manipulation kann je nach Collection-Typ variieren.

Eindeutigkeit und Reihenfolge der Elemente:

  • Arrays können doppelte Elemente enthalten und die Reihenfolge der Elemente bleibt erhalten.
  • Lists ähneln Arrays in dem Sinne, dass sie doppelte Elemente enthalten und die Reihenfolge der Elemente erhalten bleibt.
  • Sets enthalten keine Duplikate und die Reihenfolge der Elemente ist nicht garantiert (es sei denn, es handelt sich um ein LinkedHashSet, das die Einfügereihenfolge beibehält).
  • Maps speichern Schlüssel-Wert-Paare, wobei jeder Schlüssel eindeutig ist und mit einem Wert verknüpft ist. Die Reihenfolge der Schlüssel ist nicht garantiert (es sei denn, es handelt sich um eine LinkedHashMap, die die Einfügereihenfolge beibehält).

Generics und Typsicherheit:

  • Arrays haben eine stärkere Typsicherheit, da sie bei der Erstellung einen bestimmten Elementtyp erfordern.
  • Collections bieten ebenfalls Typsicherheit durch Generics, allerdings können sie aufgrund von Typ-Erasure zur Laufzeit etwas schwächer sein als Arrays.

Funktionen und Methoden:

  • Arrays und Collections bieten einige gemeinsame Funktionen und Methoden, wie forEach(), filter(), map() usw. Collections bieten jedoch zusätzliche Funktionen und Methoden, die das Arbeiten mit ihnen einfacher und ausdrucksstärker machen.

Insgesamt bieten Arrays und Collections unterschiedliche Möglichkeiten, um Gruppen von Elementen in Kotlin zu verwalten. Arrays sind für Szenarien geeignet, in denen eine feste Größe und eine hohe Leistung erforderlich sind. Collections bieten hingegen mehr Flexibilität und Funktionen, die das Arbeiten mit Gruppen von Elementen erleichtern.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert