2010-09-29 4 views
26

Mit Java (1.6) ist es besser, die clear() -Methode auf einer Liste aufzurufen oder einfach die Referenz erneut zu instanziieren?Bessere Praxis, um eine Liste neu zu instanziieren oder clear() aufzurufen

Ich habe eine ArrayList, die mit einer unbekannten Anzahl von Objekten gefüllt ist und regelmäßig "flushed" - wo die Objekte verarbeitet werden und die Liste gelöscht wird. Einmal geleert, ist die Liste wieder voll. Der Flush geschieht zu einer zufälligen Zeit. Die Anzahl in der Liste kann möglicherweise klein (10 Objekte) oder groß (Millionen Objekte) sein.

Also ist es besser, den "flush" Aufruf clear() oder neue ArrayList() zu haben?

Ist es überhaupt wichtig, sich über diese Art von Problemen Gedanken zu machen, oder sollte ich die VM sich Sorgen machen? Wie könnte ich den Speicher-Footprint von Java betrachten, um so etwas für mich selbst zu erledigen?

Jede Hilfe sehr geschätzt.

+0

Beachte Jons Antwort bezüglich des Optimierungsteils - wenn du mit hoher Intensität arbeitest und es Langsamkeit gibt, dann profiliere es. Wenn das Löschen das Problem ist, können Sie es problemlos testen, indem Sie stattdessen eine neue Liste erstellen. Aber ansonsten, verwenden Sie, was am semantisch korrekt ist - d. H. Was der Code eigentlich versucht. – aperkins

+0

Leistungsbezogene: [map-clear-vs-neu-Karte-welche-eins-wird-besser] (http://stackoverflow.com/questions/6757868/map-clear-vs-new-map-which- one-will-be-better) – nawfal

Antwort

29

Die Hauptsache ist, dass andere Code möglicherweise einen Verweis auf die Liste haben. Wenn die vorhandene Liste an anderer Stelle sichtbar ist, soll dieser Code eine gelöschte Liste anzeigen oder die vorhandene beibehalten?

Wenn nichts anderes die Liste sehen kann, würde ich es wahrscheinlich einfach löschen - aber nicht aus Leistungsgründen; nur weil die Art und Weise, wie Sie die Operation beschrieben haben, klingt eher wie Clearing als "eine neue Liste erstellen".

Die ArrayList<T> docs nicht angeben, was mit den zugrunde liegenden Datenstrukturen geschieht, aber am 1.7 Implementierung in Eclipse sucht, sieht es aus wie Sie wahrscheinlich trimToSize() nach clear() nennen sollte - sonst könnte man noch eine Liste von einem großen gesichert haben Array von Nullreferenzen. (Vielleicht ist das kein Problem für Sie, natürlich ... vielleicht ist das effizienter, als das Array kopieren zu müssen, da die Größe wieder zunimmt. Sie werden mehr darüber wissen als wir.)

(Natürlich erfordert das Erstellen einer neuen Liste nicht die alte Liste, um alle Array-Elemente auf Null zu setzen ... aber ich bezweifle, dass das in den meisten Fällen signifikant ist.)

+0

Sichtbarkeit kein Problem.Ich mag Ihre Argumentation für die klare Methode, da sie hilft zu beschreiben, was vor sich geht. Ich habe trimToSize() noch nie zuvor gesehen - ich überprüfe das. – Phil

+0

Meinten Sie auch die "1.7-Implementierung"? Sicherlich unterstützt Eclipse Java 1.7 nicht (da es noch nicht raus ist) oder habe es falsch interpretiert. – Phil

+0

@Phil: Ich benutze Build 1.7.0-ea-b78. Es ist die einzige JVM auf diesem System. Obwohl es noch nicht veröffentlicht wurde, gibt es seit Jahren Builds dafür, und Eclipse läuft darauf ohne irgendwelche Probleme, die ich gesehen habe. –

1

Ich denke, wenn der Arraylist auch sein soll häufig flushed, wie wenn es ununterbrochen in der Schleife läuft oder etwas, das dann besser verwendet, wenn die Spülung nicht zu häufig ist, dann können Sie eine neue Instance verursachen. Auch wenn Sie sagen, dass Elemente von 10 Gegenstand zu Millionen variieren können, können Sie vermutlich für ein gehen In-between Größe für jeden neuen Arraylist erstellen Sie, so dass die Arraylist kann vermeiden, Größe zu ändern, viel Zeit.

2

Die Art und Weise, wie Sie es verwenden, sieht sehr ähnlich aus, wie ein verwendet wird. Wenn Sie mit den Elementen in der Warteschlange arbeiten, werden sie entfernt, wenn Sie sie behandeln.

Die Verwendung einer der Queue-Klassen könnte den Code eleganter machen.

Es gibt auch Varianten, die gleichzeitige Aktualisierungen auf vorhersehbare Weise behandeln.

Verwandte Themen