2016-11-17 1 views
0

Ich habe eine Liste von Karten und in einer For-Schleife möchte ich eine Karte zu der Liste hinzufügen. Ich habe gehört, dass die Verwendung von map.clear() eine bessere Leistung hat als das Erstellen einer neuen Map, aber mein Problem ist, dass List.add() mit der Referenz des Objekts arbeitet und Map.clear() nicht referenziert.Hinzufügen zu einer Liste nach Wert anstelle von Referenz in Java

Gibt es eine Möglichkeit, List.add() zu zwingen, den Wert zu verwenden oder eine andere Problemumgehung zu erstellen?

+0

Wenn Sie 'clear()' auf der Karte aufrufen, sollte alles gelöscht werden. Wünschen Sie das oder wollen Sie eine Kopie der Originalkarte? –

+3

"Ich habe gehört, dass die Verwendung von map.clear() eine bessere Leistung hat als das Erstellen einer neuen Map" - Das klingt nach der Art der Mikrooptimierung, über die Sie sich keine Sorgen machen sollten, es sei denn, es gibt einen bewiesenen Grund. – bradimus

+0

Relevant: http://stackoverflow.com/questions/6757868/map-clear-vs-new-map-which-one-will-be-better – px06

Antwort

3

Es ist möglich, "nach Wert" einzufügen, indem Sie einfach eine Kopie des Map erstellen und die Kopie einfügen. Das Problem dabei ist, dass es überhaupt keine Optimierung ist.

Anstatt einfach ein neues leeres Map zu erstellen, erstellen Sie eine Kopie eines gefüllten Map und löschen Sie das Original Map. Das bedeutet: Sie vermeiden nicht den Mehraufwand beim Erstellen eines neuen Objekts, sondern führen auch die zusätzliche Arbeit des Kopierens und Löschens eines gefüllten Map ein.

Und eine kleine Notiz auf Optimierung im Allgemeinen:
Es ist ~ 10% des Codes, der 90% der Arbeit (ja, diese Zahlen sind aus tun werden, aber es ist die übliche Art und Weise über die Optimierung zu denken und zumindest nah an der Realität). Überschätzen Sie Ihren Code nicht im ersten Durchlauf. Tun Sie einfach, was leicht gemacht werden kann und ohne den Code weniger lesbar zu machen. Führen Sie einen Profiler aus und suchen Sie nach Engpässen in Ihrem Code und optimieren Sie diese. Dies ist weitaus effizienter und einfacher als die Optimierung des gesamten Codes.

1

Wenn Sie dieselbe Karte immer wieder verwenden, ist es sinnvoll, sie zu löschen, anstatt die alte Karte wegzuwerfen, um eine neue Karte zu erstellen.

Aber hier möchten Sie nicht die gleiche Map wiederverwenden, da Sie sie in einer Liste speichern möchten. Wenn Sie es löschen möchten, um es wiederzuverwenden, müssen Sie eine Kopie der Karte zur Liste hinzufügen, um unabhängige Karten zu haben. Welche eine bessere Leistung hat, ist eine Low-Level-Optimierung. Sie sollten sich nicht davon beunruhigen, es sei denn:

  • Sie gefunden haben, dass Sie durch Profilierung gefunden inakzeptablen Leistungen
  • Sie haben, dass die meiste Zeit dort verbracht wurde

Sie sollten nur verwendet werden, was ist klarer/kohärenter mit den Codierungsregeln des Projekts. Ich würde hier bei jeder Wiederholung eine brandneue Karte erstellen, aber das ist nur meine Meinung. Aber bitte machen Sie keine Low-Level-Optimierungen in frühen Entwicklungsstadien.

Verwandte Themen