Wandelbar hashmap keys eine gefährliche Praxis?
Ist es schlechte Praxis zu verwenden veränderliche Objekte als Hashmap keys? Was passiert, wenn Sie versuchen zum abrufen eines Wertes aus einer Hashmap mit einem Schlüssel, der geändert wurde, genug zu ändern, seinen hashcode?
Beispielsweise gegeben
class Key
{
int a; //mutable field
int b; //mutable field
public int hashcode()
return foo(a, b);
//setters setA and setB omitted for brevity
}
mit code
HashMap<Key, Value> map = new HashMap<Key, Value>();
Key key1 = new Key(0, 0);
map.put(key1, value1); //value1 is an instance of Value
key1.setA(5);
key1.setB(10);
Was passiert, wenn wir jetzt rufen map.get(key1)
? Ist dies sicher oder ratsam? Oder ist das Verhalten abhängig von der Sprache?
InformationsquelleAutor donnyton | 2011-10-20
Du musst angemeldet sein, um einen Kommentar abzugeben.
Es wurde von vielen bemerkt ANGESEHENE Entwickler wie Brian Goetz und Josh Bloch :
Wahrscheinlichste Quelle: Aus der Serie "Java-Theorie und Praxis" - Hashing es von Brian Goetz, May 27, 2003
InformationsquelleAutor aleroot
Dies ist nicht sicher oder ratsam ist. Der Wert zugeordnet, indem key1 nie abgerufen werden können. Wenn Sie einen Abruf, die meisten hash-maps etwas wie
In diesem Beispiel, key1.hashcode() verweist nun auf die falsche bucket der Hashtabelle, und Sie werden nicht in der Lage zum abrufen von Wert1 mit key1.
Wenn Sie hatte etwas getan, wie,
Wird diese auch nicht abrufen, Wert1, als key1 und key2 sind nicht mehr gleich, so dass diese Prüfung
fehl.
InformationsquelleAutor sbridges
Wird dies nicht funktionieren. Ändern Sie den Wert des Schlüssels, so sind Sie im Grunde werfen es Weg. Es ist wie ein echtes Leben von Schlüssel und Schloss, und dann ändern Sie den Schlüssel und versuchen, es wieder zurück in das Schloss.
InformationsquelleAutor onit
Hash-maps verwenden hash-code und Vergleiche auf Gleichheit zu identifizieren, die ein bestimmtes Schlüssel-Wert-paar mit einem bestimmten Schlüssel. Wenn die Karte hält, der Schlüssel als Hinweis auf das veränderliche Objekt, es in den Fällen, in denen die gleiche Instanz wird verwendet, um den Wert abzurufen. Bedenken Sie jedoch, folgenden Fall:
Den oben genannten ist wahr, wenn der Schlüssel gespeichert ist, als eine Referenz. In Java-in der Regel ist dies der Fall. In .NET zum Beispiel, wenn der Schlüssel einen Wert geben (immer durch Wert übergeben), wird das Ergebnis anders sein wird:
Andere Technologien vielleicht haben andere unterschiedliche Verhaltensweisen. Allerdings, fast alle von Ihnen kommen würde, zu einer situation, wo das Ergebnis mit mutable keys ist nicht deterministisch, das ist sehr sehr schlechte situation, die in einer Anwendung - eine schwer zu Debuggen und noch schwerer zu verstehen.
InformationsquelleAutor Ivaylo Slavov
Wenn key hash-code änderungen, die nach dem Schlüssel-Wert-paar (Eintrag) gespeichert ist, in HashMap, die Karte wird nicht in der Lage zum abrufen der Eintrag.
Schlüssel hashcode ändern kann, wenn das key-Objekt ist veränderlich. Mutable keys in HahsMap kann zu Datenverlust führen.
InformationsquelleAutor Vishal
Als andere erklärt, es ist gefährlich.
Einen Weg, um zu vermeiden, dass ein const-Feld geben Sie explizit den Hashwert in Ihre veränderliche Objekte (also Sie würden hash Sie auf Ihrer "Identität", nicht Ihren "Staat"). Man könnte sogar initialisieren, hash-Feld mehr oder weniger zufällig.
Ein weiterer trick wäre, um die Adresse ein, z.B.
(intptr_t) reinterpret_cast<void*>(this)
als Grundlage für die hash.In allen Fällen, Sie müssen aufgeben, hashing den wechselnden Zustand des Objekts.
InformationsquelleAutor Basile Starynkevitch
Verhalten der Karte nicht angegeben, wenn der Wert eines Objektes wird geändert, in einer Art und Weise betrifft, entspricht Vergleich beim Objekt(Veränderlich) ist ein Schlüssel. Auch für die Set mit veränderlichen Objekt als Schlüssel ist nicht eine gute Idee.
Können sehen, ein Beispiel hier :
Hier versuchen wir hinzufügen veränderliche Objekt "Mitarbeiter" auf eine Karte. Es funktioniert gut, wenn alle Tasten Hinzugefügt werden, unterscheiden.Hier habe ich überschriebenen equals und hashcode für die Mitarbeiter-Klasse.
Sehen ersten habe ich Hinzugefügt, "e" und dann "e1". Für beide von Ihnen, equals() true und hashcode gleich. Also map sieht aus, als wenn der gleiche Schlüssel ist, Hinzugefügt, so dass Sie ersetzt werden soll der alte Wert bei e1 Wert. Dann haben wir Hinzugefügt, e2,e3,e4, wir sind in Ordnung jetzt.
Aber wenn wir ändern den Wert eines bereits hinzugefügten Schlüssel ich.e "e2", es wird ein Schlüssel (ähnlich einer zuvor Hinzugefügt haben. Jetzt ist die Karte verhält sich WLAN. Idealerweise e2 ersetzen Sie den vorhandenen gleichen key hab ich.e e1.Aber jetzt Karte nimmt diese als gut. Und Sie erhalten diese in o/p :
Sehen, hier sind beide Schlüssel mit einer mit demselben Wert auch. So seine unerwartete.Nun führen Sie das gleiche Programm noch einmal durch ändern
e2.setName("diffnt");
diee2.setName("one");
hier ...Nun die o/p wird so sein :Also durch hinzufügen ändern des veränderlichen Schlüssels in einer map ist nicht zu empfehlen.
InformationsquelleAutor smruti ranjan