Praktische Anwendung von IdentityHashMap in Java 6 [duplizieren]

8

Was könnte eine praktische Verwendung der in Java 5 eingeführten IdentityHashMap sein?

    
Jyotirup 29.12.2011, 12:27
quelle

4 Antworten

4

Zum Hinzufügen dynamischer Felder zu Objekten.

Einige Sprachen unterstützen direkt dynamische Felder: Jeder kann jederzeit jedem Objekt ein beliebiges Feld hinzufügen.

Dies ist praktisch, wenn Sie Objekten Objekte zuweisen möchten, die für den Objektdesigner nicht vorhersehbar sind.

Java hat kein echtes dynamisches Feld. Wir können es simulieren, indem wir eine Identitätskarte verwenden, um ein Objekt irgendeiner Art von Information zuzuordnen.

WeakHashMap ist besser für den Zweck; Es ist auch eine Identitätskarte, und es fügt keine zusätzliche starke Referenz auf das Objekt hinzu. Es ist also viel näher am dynamischen Feldkonzept.

Nebenläufigkeit ist das verbleibende Problem. Wenn zwei Threads auf dasselbe dynamische Feld von zwei verschiedenen Objekten zugreifen, sollte es keine Abhängigkeiten zwischen zwei Threads geben. Wir können es durch eine Art von gleichzeitig schwachem hashmap lösen. Die Leistung ist jedoch nicht ideal im Vergleich zum normalen Feldzugriff.

Denken Sie an java.lang.ThreadLocal und fügen Sie dynamischen Threads ein dynamisches Feld hinzu. und java.lang.ClassValue , Hinzufügen dynamischer Felder zu Klassen. Sie sind nicht unbedingt notwendig - wir können dasselbe mit gleichzeitig schwachen Karten erreichen. Sie existieren aus Leistungsgründen. JDK kann in Thread / Class "hacken", um Unterstützung hinzuzufügen, um schnelleres Nachschlagen zu erreichen.

    
irreputable 29.12.2011, 13:35
quelle
8

Sehen Sie sich die Java-Dokumente an: - )

  

Eine typische Verwendung dieser Klasse ist ein topologieerhaltender Objektgraph   Transformationen wie Serialisierung oder Deep-Copying. Aufführen   Solch eine Transformation, ein Programm muss eine "Knotentabelle" beibehalten, die   verfolgt alle Objektverweise, die bereits vorhanden waren   verarbeitet. Die Knotentabelle darf nicht unterschiedliche Objekte gleichsetzen, auch wenn   sie sind zufällig gleich. Eine weitere typische Verwendung dieser Klasse besteht darin,   Proxy-Objekte verwalten Zum Beispiel könnte eine Fehlersucheinrichtung wünschen   um ein Proxy-Objekt für jedes Objekt in dem Programm zu erhalten   debuggte.

Nebenbei bemerkt: es ist seit Version 1.4 verfügbar, nicht Java 5 oder 6 ...

    
Matten 29.12.2011 12:32
quelle
2

Wenn Sie veränderbare Objekte serialisieren, möchten Sie die Objekte, die Sie serialisiert haben, und ihre Referenz-ID verfolgen. Sie können die Gleichheit nicht verwenden, da Sie nicht davon ausgehen können, dass änderbare Objekte Identitätsprüfungen für equals verwenden und nicht geändert werden. z.B. Das Datum ist veränderbar und equals vergleicht den Inhalt.

    
Peter Lawrey 29.12.2011 12:32
quelle

Tags und Links