2017-03-12 6 views
1

Ich möchte verstehen, warum CopyOnWriteArraySet die doppelten Elemente in ihnen nicht erlaubt (Ignorieren). Ich verstehe die Tatsache, dass, da es SET ist, es beabsichtigt, Duplikate zu vermeiden.Duplikate in CopyOnWriteArraySet nicht erlaubt, obwohl es eine interne CopyOnWriteArrayList für alle seine Operationen verwendet

Aber Acccording zum Orakel Definition: CopyOnWriteArraySet: Ein Set, das für alle ihre Operationen eine interne CopyOnWriteArrayList verwendet. Oracle java docs

So praktisch sollte es Duplikate ermöglichen. Ist es die interne Implementierung der add() -Methode, die die doppelten Elemente einschränkt?

+2

Werfen Sie einen Blick auf add-Methode ruft es 'addIfAbsent' als' public boolean add (E e) { Rückgabe al.addIfAbsent (e); } ' – SMA

+0

Dieser Satz bedeutet, dass die Funktionalität des Satzes auf der CopyOnWriteArrayList aufgebaut ist. –

+0

@ SMA: Dies beantwortet meine Frage. Wenn man alle Konzepte im Auge behält, ist es die interne Implementierung, die sie voneinander trennt. 'public CopyOnWriteArraySet() { al = neue CopyOnWriteArrayList (); } ' –

Antwort

1

So praktisch sollte es Duplikate ermöglichen.

Nein, sollte es nicht. Es ist ein Set. Wenn es Duplikate erlaubt, sollte es nicht als ein Satz bezeichnet werden.

Aber nach der Oracle-Definition: CopyOnWriteArraySet: Ein Set, das eine interne CopyOnWriteArrayList für alle seine Operationen verwendet.

Dies ist nur hilfreiche Informationen, so dass, wenn Sie bereits vertraut sind mit CopyOnWriteArrayList, dann werden Sie die Konsequenzen verstehen, wie Thread-Sicherheit auf Kosten der langsamen schreibt.

Im Allgemeinen sollten die Implementierungsdetails nicht Ihre Angelegenheit sein. Diese Klasse implementiert Set, also sollte es sich so verhalten. Es ist die Aufgabe der Autoren dieser Klasse, sicherzustellen, dass es keine Duplikate gibt, obwohl eine Datenstruktur verwendet wird, die Duplikate enthalten kann. Die Autoren sollten auch potenzielle Performance-Engpässe vermeiden, die durch die zugrunde liegende Datenstruktur impliziert werden, wie z. B. lineare Lookups anstelle von etwas schnellerem, was normalerweise von Sets erwartet wird.

Schließlich bedenken Sie, dass, nur weil Sie etwas tun kann, nicht bedeutet, dass Sie sollte.

2

Sie vermischen den VERTRAG und die UMSETZUNG dieser Klasse.

Oracle kann die zugrunde liegende Implementierung jederzeit ändern: Es kommt nur auf das Verhalten dieser implementierenden Klasse von Set an.

Mit anderen Worten: die Tatsache, dass "uses list" im javadoc angezeigt wird, soll dem Benutzer lediglich hilfreiches Kontextwissen über diese Set-Implementierung geben.

Verwandte Themen