IdentityHashMap Klasse
Definition
Wichtig
Einige Informationen beziehen sich auf Vorabversionen, die vor dem Release ggf. grundlegend überarbeitet werden. Microsoft übernimmt hinsichtlich der hier bereitgestellten Informationen keine Gewährleistungen, seien sie ausdrücklich oder konkludent.
Diese Klasse implementiert die Map
-Schnittstelle mit einer Hashtabelle, wobei beim Vergleichen von Schlüsseln (und Werten) die Verweisgleichheit anstelle von Objektgleichheit verwendet wird.
[Android.Runtime.Register("java/util/IdentityHashMap", DoNotGenerateAcw=true)]
[Java.Interop.JavaTypeParameters(new System.String[] { "K", "V" })]
public class IdentityHashMap : Java.Util.AbstractMap, IDisposable, Java.Interop.IJavaPeerable, Java.IO.ISerializable, Java.Lang.ICloneable
[<Android.Runtime.Register("java/util/IdentityHashMap", DoNotGenerateAcw=true)>]
[<Java.Interop.JavaTypeParameters(new System.String[] { "K", "V" })>]
type IdentityHashMap = class
inherit AbstractMap
interface ISerializable
interface IJavaObject
interface IDisposable
interface IJavaPeerable
interface ICloneable
interface IMap
- Vererbung
- Attribute
- Implementiert
Hinweise
Diese Klasse implementiert die Map
-Schnittstelle mit einer Hashtabelle, wobei beim Vergleichen von Schlüsseln (und Werten) die Verweisgleichheit anstelle von Objektgleichheit verwendet wird. Mit anderen Worten, in einem IdentityHashMap
werden zwei Schlüssel k1
und k2
als gleich angesehen, wenn und nur, wenn (k1==k2)
. (In normalen Map
Implementierungen (wie HashMap
) zwei Schlüssel k1
und k2
werden als gleich betrachtet, wenn und nur, wenn (k1==null ? k2==null : k1.equals(k2))
.)
<b>Diese Klasse ist keine allgemeine Map
Implementierung! Diese Klasse implementiert zwar die Map
-Schnittstelle, verletzt aber absichtlich den Map's
allgemeinen Vertrag, der die Verwendung der equals
-Methode beim Vergleichen von Objekten vorschreibt. Diese Klasse ist nur für die Verwendung in den seltenen Fällen konzipiert, in denen referenzgleiche Semantik erforderlich ist.</B>
Eine typische Verwendung dieser Klasse sind topologierhaltende Objektgraphtransformationen, z. B. Serialisierung oder deep-copy. Um eine solche Transformation auszuführen, muss ein Programm eine "Knotentabelle" verwalten, die alle bereits verarbeiteten Objektverweise nachverfolgt. Die Knotentabelle darf unterschiedliche Objekte nicht gleichsetzen, auch wenn sie zufällig gleich sind. Eine weitere typische Verwendung dieser Klasse ist die Verwaltung von Proxyobjekten. Beispielsweise kann eine Debugfunktion ein Proxyobjekt für jedes Objekt im zu debuggenden Programm verwalten.
Diese Klasse stellt alle optionalen Zuordnungsvorgänge bereit und lässt null
Werte und den null
Schlüssel zu. Diese Klasse gibt keine Garantien für die Reihenfolge der Karte; insbesondere garantiert sie nicht, dass die Bestellung im Laufe der Zeit konstant bleibt.
Diese Klasse bietet eine konstante Zeitleistung für die grundlegenden Vorgänge (get
und put
), vorausgesetzt, die Systemidentitätshashfunktion (System#identityHashCode(Object)
) verteilt Elemente ordnungsgemäß auf die Buckets.
Diese Klasse verfügt über einen Optimierungsparameter (der sich auf die Leistung auswirkt, aber nicht auf die Semantik): die erwartete maximale Größe. Dieser Parameter ist die maximale Anzahl von Schlüssel-Wert-Zuordnungen, die die Zuordnung enthalten soll. Intern wird dieser Parameter verwendet, um die Anzahl der Buckets zu bestimmen, die ursprünglich die Hashtabelle enthalten. Die genaue Beziehung zwischen der erwarteten maximalen Größe und der Anzahl der Buckets ist nicht angegeben.
Wenn die Größe der Zuordnung (die Anzahl der Schlüssel-Wert-Zuordnungen) die erwartete maximale Größe ausreichend überschreitet, wird die Anzahl der Buckets erhöht. Das Erhöhen der Anzahl von Buckets ("Rehashing") kann ziemlich teuer sein, daher lohnt es sich, Identitätshashzuordnungen mit einer ausreichend großen erwarteten maximalen Größe zu erstellen. Auf der anderen Seite erfordert die Iteration über Sammlungsansichten zeit proportional zur Anzahl der Buckets in der Hashtabelle, sodass es sich lohnt, die erwartete maximale Größe nicht zu hoch festzulegen, wenn Sie sich besonders mit der Iterationsleistung oder der Speicherauslastung befassen.
<Strong>Beachten Sie, dass diese Implementierung nicht synchronisiert wird.</strong> Wenn mehrere Threads gleichzeitig auf eine Identitätshashzuordnung zugreifen und mindestens einer der Threads die Zuordnung strukturell ändert, muss sie extern synchronisiert werden. (Eine strukturelle Änderung ist jeder Vorgang, der eine oder mehrere Zuordnungen hinzufügt oder löscht. Das bloße Ändern des Werts, der einem Schlüssel zugeordnet ist, der bereits in einem instance enthalten ist, ist keine strukturelle Änderung.) Dies wird in der Regel erreicht, indem für ein Objekt synchronisiert wird, das die Karte natürlich kapselt.
Wenn kein solches Objekt vorhanden ist, sollte die Zuordnung mithilfe der Collections#synchronizedMap Collections.synchronizedMap
-Methode "umschlossen" werden. Dies erfolgt am besten bei der Erstellung, um den versehentlichen nicht synchronisierten Zugriff auf die Karte zu verhindern:
Map m = Collections.synchronizedMap(new IdentityHashMap(...));
Die von der iterator
-Methode der Auflistungen zurückgegebenen Iteratoren, die von allen "Auflistungsansichtsmethoden" dieser Klasse zurückgegeben werden, sind fail-fast: Wenn die Zuordnung jederzeit strukturell geändert wird, nachdem der Iterator erstellt wurde, außer über die eigene remove
Methode des Iterators, löst der Iterator einen aus ConcurrentModificationException
. Daher schlägt der Iterator angesichts gleichzeitiger Änderungen schnell und sauber fehl, anstatt willkürliches, nicht deterministisches Verhalten zu einem unbestimmten Zeitpunkt in der Zukunft zu riskieren.
Beachten Sie, dass das fail-fast-Verhalten eines Iterators nicht garantiert werden kann, da es im Allgemeinen unmöglich ist, bei nicht synchronisierter gleichzeitiger Änderung feste Garantien zu treffen. Fail-Fast-Iteratoren lösen ConcurrentModificationException
nach bestem Aufwand aus. Daher wäre es falsch, ein Programm zu schreiben, das von dieser Ausnahme abhängig ist, um korrekt zu sein: Fail-Fast-Iteratoren sollten nur verwendet werden, um Fehler zu erkennen.
Diese Klasse ist ein Mitglied des Java Collections Framework.
In Version 1.4 hinzugefügt.
Java-Dokumentation für java.util.IdentityHashMap
.
Teile dieser Seite sind Änderungen, die auf Arbeiten basieren, die vom Android Open Source Project erstellt und freigegeben wurden und gemäß den In Attribution License beschriebenen Begriffen verwendet werden.
Konstruktoren
IdentityHashMap() |
Erstellt eine neue, leere Identitätshashzuordnung mit einer standardmäßig erwarteten maximalen Größe (21). |
IdentityHashMap(IDictionary) |
Erstellt eine neue Identitätshashzuordnung, die die Schlüssel-Wert-Zuordnungen in der angegebenen Zuordnung enthält. |
IdentityHashMap(Int32) |
Erstellt eine neue, leere Zuordnung mit der angegebenen maximalen Größe. |
IdentityHashMap(IntPtr, JniHandleOwnership) |
Ein Konstruktor, der beim Erstellen verwalteter Darstellungen von JNI-Objekten verwendet wird; wird von der Runtime aufgerufen. |
Eigenschaften
Class |
Gibt die Laufzeitklasse dieses |
Handle |
Das Handle für die zugrunde liegende Android-instance. (Geerbt von Object) |
IsEmpty |
Hinzugefügt werden (Geerbt von AbstractMap) |
JniIdentityHashCode |
Diese Klasse implementiert die |
JniPeerMembers |
Diese Klasse implementiert die |
PeerReference |
Diese Klasse implementiert die |
ThresholdClass |
Diese API unterstützt die Mono für Android-Infrastruktur und ist nicht für die direkte Verwendung aus Ihrem Code vorgesehen. |
ThresholdType |
Diese API unterstützt die Mono für Android-Infrastruktur und ist nicht für die direkte Verwendung aus Ihrem Code vorgesehen. |
Methoden
Clear() |
Hinzugefügt werden (Geerbt von AbstractMap) |
Clone() |
Gibt eine flache Kopie dieser Identitätshashzuordnung zurück: Die Schlüssel und Werte selbst werden nicht geklont. |
ContainsKey(Object) |
Hinzugefügt werden (Geerbt von AbstractMap) |
ContainsValue(Object) |
Hinzugefügt werden (Geerbt von AbstractMap) |
Dispose() |
Diese Klasse implementiert die |
Dispose(Boolean) |
Diese Klasse implementiert die |
EntrySet() |
Gibt eine |
Equals(Object) |
Gibt an, ob ein anderes Objekt "gleich" diesem objekt ist. (Geerbt von Object) |
ForEach(IBiConsumer) |
Diese Klasse implementiert die |
Get(Object) |
Hinzugefügt werden (Geerbt von AbstractMap) |
GetHashCode() |
Gibt einen Hashcodewert für das Objekt zurück. (Geerbt von Object) |
JavaFinalize() |
Wird vom Garbage Collector für ein Objekt aufgerufen, wenn die Garbage Collection feststellt, dass keine Verweise mehr auf das Objekt vorhanden sind. (Geerbt von Object) |
KeySet() |
Hinzugefügt werden (Geerbt von AbstractMap) |
Notify() |
Aktiviert einen einzelnen Thread, der auf den Monitor dieses Objekts wartet. (Geerbt von Object) |
NotifyAll() |
Aktiviert alle Threads, die auf den Monitor dieses Objekts warten. (Geerbt von Object) |
Put(Object, Object) |
Hinzugefügt werden (Geerbt von AbstractMap) |
PutAll(IDictionary) |
Hinzugefügt werden (Geerbt von AbstractMap) |
Remove(Object) |
Hinzugefügt werden (Geerbt von AbstractMap) |
ReplaceAll(IBiFunction) |
Diese Klasse implementiert die |
SetHandle(IntPtr, JniHandleOwnership) |
Legt die Handle-Eigenschaft fest. (Geerbt von Object) |
Size() |
Hinzugefügt werden (Geerbt von AbstractMap) |
ToArray<T>() |
Diese Klasse implementiert die |
ToString() |
Gibt eine Zeichenfolgendarstellung des Objekts zurück. (Geerbt von Object) |
UnregisterFromRuntime() |
Diese Klasse implementiert die |
Values() |
Hinzugefügt werden (Geerbt von AbstractMap) |
Wait() |
Bewirkt, dass der aktuelle Thread wartet, bis er aktiviert ist, in der Regel durch <>Benachrichtigung</em> oder <em>interrupted</em>. (Geerbt von Object) |
Wait(Int64) |
Bewirkt, dass der aktuelle Thread wartet, bis er aktiviert ist, in der Regel durch>< Benachrichtigung</em> oder <em>interrupted</em>, oder bis eine bestimmte Menge an Echtzeit verstrichen ist. (Geerbt von Object) |
Wait(Int64, Int32) |
Bewirkt, dass der aktuelle Thread wartet, bis er aktiviert ist, in der Regel durch>< Benachrichtigung</em> oder <em>interrupted</em>, oder bis eine bestimmte Menge an Echtzeit verstrichen ist. (Geerbt von Object) |
Explizite Schnittstellenimplementierungen
IJavaPeerable.Disposed() |
Diese Klasse implementiert die |
IJavaPeerable.DisposeUnlessReferenced() |
Diese Klasse implementiert die |
IJavaPeerable.Finalized() |
Diese Klasse implementiert die |
IJavaPeerable.JniManagedPeerState |
Diese Klasse implementiert die |
IJavaPeerable.SetJniIdentityHashCode(Int32) |
Diese Klasse implementiert die |
IJavaPeerable.SetJniManagedPeerState(JniManagedPeerStates) |
Diese Klasse implementiert die |
IJavaPeerable.SetPeerReference(JniObjectReference) |
Diese Klasse implementiert die |
Erweiterungsmethoden
JavaCast<TResult>(IJavaObject) |
Führt eine Typkonvertierung mit Überprüfung der Android-Laufzeit aus. |
JavaCast<TResult>(IJavaObject) |
Diese Klasse implementiert die |
GetJniTypeName(IJavaPeerable) |
Diese Klasse implementiert die |