Mit Set - Entfernt Duplikate automatisch?
Habe ich eine Klasse als unten (Bean):
class KeysHolder {
Long kitId;
String packId;
String boxId;
//getters and setters
.......
//@Override equals and hashCode
}
Habe ich ein set enthält die obigen Objekte
Set<KeysHolder> keys;
Nun, wenn ich halten Sie das hinzufügen des Objekts zum einstellen, macht es automatisch entfernen Duplikate auf der Grundlage der Werte der einzelnen Elemente? (Ich verstehe es nutzt Überschriebene equals-und hashCode-Methoden intern).
Der Letzte Satz enthält keine Duplikate, basierend auf jedem Feld der Gleichstellung.
obja.kitId = objb.kitId
objb.packid = objb.packId
obja.boxId = objb.boxId
Dank!
Du musst angemeldet sein, um einen Kommentar abzugeben.
Des Elements, falls gefunden, duplizieren, indem Sie die
Set
Umsetzung ,würde nicht eingesetzt werden bei allen.Aus den Javadocs von HashSet#add(E e):
HashSet
verwendetHashmap#put()
.Die kurze Antwort ist ja, jeder Satz wird die de-Duplizierung von selbst. Aber das ist nur gewährleistet, wenn Sie respektieren den Auftrag; und der Auftrag ist ein bisschen Verschieden für jede
Set
Umsetzung:Für eine
HashSet
, wie Sie bemerkt, Sie haben zu implementierenhashCode()
undequals()
. Doch damit nicht genug: wenn Sie halten veränderlich - Instanzen in einerHashSet
und ändern Sie die Eigenschaften, die Einfluss auf diehashCode()
/equals()
Ergebnis, werden Sie noch am Ende in einer seltsamen situation.Mit einem
TreeSet
, auf der anderen Seite, müssen Sie sicherstellen, dass IhreComparable.compareTo()
oderComparator.compare()
Methoden sind konsistent mitequals()
.Lesen Sie also die Dokumentation der
Set
und der tatsächlichen Umsetzung, die zu Ihren Bedürfnissen passt und versuchen den Vertrag halten.Kann ja jeder
Set
Umsetzung würde nicht zulassen, dass Duplikate.Aber, es kommt mit einem Nachteil. Für eine
Set
und andere hash-basierten Sammlungen, die Sie benötigen, um sicherzustellen, dass die Objekte, die Sie versuchen, einfügen, überschreiben Ihreequals()
sowiehashCode()
Methode richtig.Durch die richtige, ich meine, dass
equals()
zurückkehren solltetrue
für sinnvoll zwei gleichwertige Objekte, und dass diehashCode()
sollten versuchen, wieder als disparate Werte wie möglich für den Bereich der Objekte in der Eingabe festlegen.Während eine unsachgemäße
equals()
Umsetzung würde wahrscheinlich brechen Sie Ihr Programm; eine ineffizientehashCode()
Umsetzung beeinträchtigt IhreSet
's performance, d.h. Operationen wieadd()
,contains()
etc. wäre so langsam wie schlecht die Umsetzung.HashSet intern verwendet, HashMap, die map ist gepflegt mit Schlüssel als der Wert, den Sie hinzufügen möchten, in der Menge und Wert ist eine Instanz der Object-Klasse( final private static final Objekt = new Objekt();). Wenn man nun dasselbe Objekt zu diesem Satz, es ist der gleiche Vorgang, die Karte wird, wenn Sie Karte.mit der gleichen auf die gleiche Taste, nur aktualisieren Sie den Wert.
Jedoch der Wert aktualisiert werden, bleibt immer noch die gleiche, die VORHANDEN. Und damit, wie Sie sagen können, dass das set nicht hinzufügen gleichen Wert. Obwohl eigentlich anzeigen, das wird intern verwendet, um die Implementierung dieses set ist die Aktualisierung selbst mit *gleichen Schlüssel* und gleichen Wert(VORHANDEN).
Ich geschrieben habe, ein Beispiel, um zu veranschaulichen, wie entfernen von doppelten Mitarbeiter-Eintrag in einem Satz basiert ein Feld in der Klasse, hier
name
:Alles, was ich brauchte, zu tun ist, überschreiben von Methoden
hashCode
undequals
in Employee-Klasse. Es druckt: