Java - Die IdentityHashMap-Klasse

Einführung

Hallo Zukunftige Java-Entwickler! Heute erleben wir eine aufregende Reise in die Welt der Java-IdentityHashMap-Klasse. Ich weiß, was ihr vielleicht denkt: "Noch eine Map-Klasse? Haben wir nicht gerade über HashMap gelernt?" Richtig, aber glaubt mir, IdentityHashMap hat ihre eigene einzigartige Qualität, die sie besonders macht. Los geht's!

Java - The IdentityHashMap Class

Klassendeklaration

Zuerst Mal, so deklarieren wir eine IdentityHashMap:

import java.util.IdentityHashMap;

IdentityHashMap<String, Integer> meineMap = new IdentityHashMap<>();

Diese Codezeile erstellt eine neue IdentityHashMap, die String-Schlüssel und Integer-Werte speichert. Was unterscheidet sie von einer regulären HashMap? Hier wird es interessant!

Klassenkonstruktoren

IdentityHashMap verfügt über vier Konstruktoren. Lassen Sie uns diese analysieren:

  1. Standardkonstruktor:

    IdentityHashMap<String, Integer> map1 = new IdentityHashMap<>();

    Dies erstellt eine leere IdentityHashMap mit einer Standardkapazität von 21.

  2. Konstruktor mit anfänglicher Kapazität:

    IdentityHashMap<String, Integer> map2 = new IdentityHashMap<>(100);

    Dies erstellt eine leere IdentityHashMap mit der angegebenen anfänglichen Kapazität.

  3. Konstruktor mit einer anderen Map:

    Map<String, Integer> existierendeMap = new HashMap<>();
    IdentityHashMap<String, Integer> map3 = new IdentityHashMap<>(existierendeMap);

    Dies erstellt eine IdentityHashMap mit denselben Mappings wie die angegebene Map.

  4. Konstruktor mit erwarteter maximaler Größe:

    IdentityHashMap<String, Integer> map4 = new IdentityHashMap<>(100, 0.75f);

    Dies erstellt eine leere IdentityHashMap mit der angegebenen erwarteten maximalen Größe und dem Lastfaktor.

Klassenmethoden

Nun schauen wir uns einige der am häufigsten verwendeten Methoden in IdentityHashMap an:

Methode Beschreibung
put(K schlüssel, V wert) Verknüpft den angegebenen Wert mit dem angegebenen Schlüssel
get(Object schlüssel) Liefert den Wert, auf den der angegebene Schlüssel gemappt ist
remove(Object schlüssel) Entfernt das Mapping für diesen Schlüssel, falls vorhanden
clear() Entfernt alle Mappings von dieser Map
size() Liefert die Anzahl der Schlüssel-Wert-Mappings in dieser Map
isEmpty() Liefert true zurück, wenn diese Map keine Schlüssel-Wert-Mappings enthält
containsKey(Object schlüssel) Liefert true zurück, wenn diese Map ein Mapping für den angegebenen Schlüssel enthält
containsValue(Object wert) Liefert true zurück, wenn diese Map einen oder mehrere Schlüssel auf den angegebenen Wert mappt

Sehen wir uns einige dieser Methoden in Aktion an:

IdentityHashMap<String, Integer> alter = new IdentityHashMap<>();

// Hinzufügen von Schlüssel-Wert-Paaren
alter.put("Alice", 25);
alter.put("Bob", 30);

// Abrufen eines Wertes
System.out.println("Alice's Alter: " + alter.get("Alice")); // Ausgabe: Alice's Alter: 25

// Überprüfen, ob ein Schlüssel existiert
System.out.println("Gibt es Charlie? " + alter.containsKey("Charlie")); // Ausgabe: Gibt es Charlie? false

// Entfernen eines Schlüssel-Wert-Paares
alter.remove("Bob");

// Überprüfen der Größe
System.out.println("Anzahl der Einträge: " + alter.size()); // Ausgabe: Anzahl der Einträge: 1

Vererbte Methoden

IdentityHashMap erbt Methoden von ihren Superklassen und Schnittstellen. Hier sind einige davon:

Vererbt von Methoden
java.util.AbstractMap clone(), equals(), hashCode(), toString()
java.util.Map entrySet(), keySet(), values()
java.lang.Object finalize(), getClass(), notify(), notifyAll(), wait()

Beispiel für das Hinzufügen eines Schlüssel-Wert-Mappings in eine IdentityHashMap

Nun tauchen wir ein in das, was IdentityHashMap besonders macht. Im Gegensatz zu HashMap, der die equals() Methode verwendet, um Schlüssel zu vergleichen, verwendet IdentityHashMap Referenz-Gleichheit (==). Das bedeutet, dass zwei Schlüssel nur dann als gleich betrachtet werden, wenn sie das gleiche Objekt im Speicher sind.

Sehen wir uns das an:

IdentityHashMap<String, String> identityMap = new IdentityHashMap<>();

String schlüssel1 = new String("Hallo");
String schlüssel2 = new String("Hallo");

identityMap.put(schlüssel1, "Welt1");
identityMap.put(schlüssel2, "Welt2");

System.out.println("Größe der IdentityHashMap: " + identityMap.size());
System.out.println("Wert für schlüssel1: " + identityMap.get(schlüssel1));
System.out.println("Wert für schlüssel2: " + identityMap.get(schlüssel2));

Ausgabe:

Größe der IdentityHashMap: 2
Wert für schlüssel1: Welt1
Wert für schlüssel2: Welt2

Unglaublich? Obwohl schlüssel1 und schlüssel2 den gleichen Inhalt ("Hallo") haben, behandelt IdentityHashMap sie als verschiedene Schlüssel, weil sie verschiedene String-Objekte im Speicher sind.

Dieses Verhalten kann in bestimmten Szenarien unglaublich nützlich sein. Stellen Sie sich zum Beispiel vor, Sie schreiben ein Programm, um verschiedene Versionen eines Dokuments zu verfolgen. Jede Version könnte den gleichen Titel haben, aber Sie möchten sie als separate Entitäten behandeln. IdentityHashMap wäre dafür perfekt!

Zusammenfassend lässt sich sagen, dass IdentityHashMap wie der quirky Cousin in der Map-Familie ist. Sie sieht ähnlich wie die anderen aus, hat aber ihre eigene einzigartige Art und Weise. Das Verständnis, wann man sie verwendet, kann Sie zu einem flexibleren Java-Programmierer machen.

Denken Sie daran, in der Welt der Programmierung gibt es keine Ein-Size-fits-all-Lösung. Jedes Werkzeug hat seinen Platz, und das Wissen, wann man IdentityHashMap verwendet, ist ein weiterer Pfeil in Ihrem Bogen der Java-Kenntnisse. Üben Sie weiter, bleiben Sie neugierig und happy coding!

Credits: Image by storyset