2012-04-22 8 views
7

Ich bin mir nicht sicher, ob diese Frage sprachunabhängig ist oder nicht, also werde ich das nur als Java-Frage stellen. Wenn Sie eine Schleife wieEffizienz beim Erstellen neuer Objekte in einer Schleife

haben

Wird neuer Speicherplatz im Speicher durch jede Iteration der Schleife erstellt? Wenn ja, wird der alte Raum entsorgt? Wenn nicht, ist es effizienter, so etwas wie dieses

Object obj = new Object; 
for (int i = 0; i < 9; i++) { 
    // fill object 
    // do something with data 
} 

bearbeiten zu tun: Aktualisierte Code besser, die Frage exemplifizieren

+0

Ich denke nicht, dass Sie String auf dem Heap erstellen sollten. Der beste Ansatz besteht darin, eine String-Variable wie String-Objekt = null zu erstellen, dies ist nichts anderes als ein Zeiger auf die Zeichenfolge. Jedes Mal, wenn Sie iterieren, erstellen Sie String-Objekte auf dem Heap, und dieser Ansatz ist langsamer als der vorherige. Hoffe, das hilft – allthenutsandbolts

+1

Diese beiden Schleifen machen ganz andere Dinge. –

+1

Es gibt ähnliche [Frage] (http://StackOverflow.com/Q/8803674/617996) bereits .... – PrimosK

Antwort

9

Kurze Antwort: nur solche Dinge ignorieren, während in Java zu entwickeln, auch weil die meisten dieser Probleme sind schwarz umrandet und werden von der JVM selbst verwaltet.

Der Müllsammler wird wissen, was zu tun ist, und es wird versuchen, das beste Ding je nach der Situation zu tun.

Darüber hinaus machen Ihre spezifischen Beispiele für mich keinen Sinn. Können Sie es weiter ausführen?

+0

Ich nehme es dann diese gleiche Antwort würde nicht für Sprachen, die keine Garbage Collection wie C++ – Steve

+1

Nr. Die gleiche Antwort gelten gilt auch in C++. Das Prinzip besteht darin, die Dinge nicht zu optimieren, bis man einen guten Beweis dafür hat, dass es sich lohnt. (Leider ignorieren viele C/C++ - Programmierer dieses Prinzip ...) –

+0

Wenn Sie sagen, Dinge zu ignorieren, bedeutet das, die Objekt-Erstellung in den innersten passenden Bereich zu legen, wie hier http://stackoverflow.com/questions/8803674/declaring-variables-inside-or-out-side-of-a-loop – Steve

1

Warum führen Sie nicht einige Tests durch und sehen sich die Ergebnisse an? Es ist wahr, dass Garbage Collector funktioniert, aber Sie können nicht wissen, dass es am besten funktioniert. Wenn Sie mit großen Datenmengen arbeiten, kann dies Ihre Effizienz beeinträchtigen.

Ich denke, this link würde helfen, zu verfolgen, was Sie brauchen.

7

Die grundlegende Antwort „lassen die Figur Garbage Collector it out“ richtig ist, aber Sie sollten auch verstehen, dass die Wirkung dieser zwei Aussagen:

ist (1) ein neues (leer) String, und weisen Sie es "object" zu, gefolgt von (2) zuweisen Sie den Wert von array[i] zu "Objekt".

Die Zuweisung in (2) überschreibt, was Sie in (1) getan haben, daher wird der erste String, den Sie erstellt haben, nie verwendet. Der Garbage Collector wird schließlich den Speicher zurückfordern, so dass Sie sich keine Gedanken darüber machen müssen, dass er verloren geht, aber es ist immer noch eine unnötige Zuweisung; Sie konnte einfach auch mit String object = null;

beachten Sie, dass String s sind unveränderlich in Java beginnen, so dass, sobald Sie ein String Objekt zuweisen Sie ihren Wert nicht ändern können - Sie eine String Variable auf ein neues Objekt beziehen machen kann, aber Sie können ein vorhandenes nicht ändern.

Verwandte Themen