2009-06-30 6 views
-1
Set<Type> union = new HashSet<Type>(s1); 
union.addAll(s2); 

UNDGibt es einen Unterschied zwischen diesen beiden Gruppen von Aussagen

Set <Type> union = new HashSet<Type>(); 
union.addAll(s1); 
union.addAll(s2); 
+0

diese Frage zweimal, bevor wurde gefragt: http://stackoverflow.com/questions/1058331/what-is-the-exact-difference-between-these-two-groups-of-statements-closed und http: //stackoverflow.com/questions/1058205/what-is-the-exact-difference-between-these-two-groups-of-statements – akf

+0

bitte erklären Sie diese Dinge logisch und programmatisch – Johanna

+0

schauen Sie sich diesen Link an: http: // java Englisch: www.doc-o-matic.com/webhelp/Tdlg.html In dem Bulk - Operationsteil können Sie sehen, dass geschrieben wird: Um die Vereinigung, den Schnittpunkt oder die Set - Differenz von zwei Sätzen zerstörungsfrei zu berechnen (ohne zu modifizieren Deutsch: www.doc-o-matic.de/webhelp/TdlgEditEditE.html gesetzt), muss der Aufrufer einen Satz kopieren, bevor er die entsprechende Massenoperation aufruft. Das Folgende sind die resultierenden Idiome. so sollte es einen Unterschied zwischen diesen beiden Gruppen von Aussagen geben. – Johanna

Antwort

2

Der Unterschied hier ist viel weniger als Ihre vorherige Frage.
Der erste Weg sollte schneller sein, weil das Original Set nicht so viel wachsen muss.

Die Art und Weise Sie dies wollen, können zu tun ist:

Set<Type> union = new HashSet<Type>(s1.size() + s2.size()); 
union.addAll(s1); 
union.addAll(s2); 

diese Weise werden Sie die neue Set gar nicht die Größe haben. (Auch wenn Sie etwas mehr Platz haben könnten)

1

Programmatically oder logisch?

Ursache am Ende Sie am Ende mit der gleichen Sammlung.

0

Die erste Version könnte ein bisschen effizienter sein, weil sie genügend Platz für die Elemente von s1 reserviert.

1

Ich würde mit der zweiten Form gehen, weil es klarer zu lesen ist. Es ist einfacher zu sehen, dass dies dem Set zwei Dinge hinzufügt, weil es explizit ist. Die Verwendung von zwei verschiedenen Arten, Dinge in das Set zu legen, verschleiert die Tatsache, dass dieselbe Operation zweimal ausgeführt wird.

0

aus dem Quellcode Java 6, können wir sehen, dass der Konstruktor addAll tatsächlich aufruft, sobald sie die Sätze Größe initialisiert hat:

public HashSet(Collection<? extends E> c) { 
    map = new HashMap<E,Object>(Math.max((int) (c.size()/.75f) + 1, 16)); 
    addAll(c); 
} 

Beachten Sie, dass dies fügt mindestens 1/3 zusätzliche Kapazität, so sein kann, gut genug, wenn s2 klein ist oder Sie eine recht große Anzahl sich überschneidender Werte in den beiden Mengen erwarten.

Ansonsten sind alle anderen Antworten sinnvoll!

0

Es hängt von der Größe Ihrer zwei Sätze ab.

(Methode 1)
Der erste Weg ist zu sagen:

Set union = new HashSet(); 
union.addAll(s1); 
union.addAll(s2); 

Die 3-Anweisungen erfordert, und ist nicht auf anfänglich groß genug sein, garantiert alle Ihre Elemente zu halten. Der Standard-Hintergrundspeicher ist 16 Elemente. Wenn Sie mehr als 16 Elemente zwischen s1 und s2 haben, ist der Aufruf des Konstruktors ohne Parameter weniger effizient, da ein neuer Sicherungsspeicher erstellt werden muss, der groß genug ist, um sowohl s1 als auch s2 zu speichern.

(Methode 2)
Wenn Sie sagen:

Set union = new HashSet(s1.size() + s2.size()); 
union.addAll(s1); 
union.addAll(s2); 

Sie garantiert werden, um einen Satz zu haben, die alle Ihre Artikel halten, aber das erfordert auch drei Aussagen.

(Methode 3)
Wenn Sie ein neues HashSet mit einem Set erstellen, weist es die doppelte Größe dieses Satzes zu. (Java api link) Also, wenn s1 größer als s2 ist, erhalten Sie den gleichen Effekt mit den Worten:

Set union = new HashSet(s1); 
union.addAll(s2); 

Und Sie brauchen nur zwei Aussagen.

Wenn Sie im Voraus wissen, welcher Satz größer sein wird, verwenden Sie Methode # 3, aber wenn Sie dies nicht tun, verwenden Sie Methode # 2.

+0

Die Anweisung über die Zuordnung, die doppelt so groß wie HashSet ist, gilt nur für Java Version 1.3.1 und älter. Wenn Sie 1.4.2 oder neuer verwenden, ist Methode # 2 in den meisten Situationen wahrscheinlich die beste. –

Verwandte Themen