Java-Performance: der Beim löschen eines Objekts ist es besser, auf null gesetzt oder ein neues Objekt erstellen.
Wenn ein Objekt wiederholt, ist es besser, um die Daten zu löschen, indem Sie Sie auf null, oder instanziieren Sie ein neues Objekt?
Object a = new Object();
for(...){
...
a = null;
**OR**
a = new Object();
}
Hier ist das Beispiel, das ich mich beziehe:
Customer a = new Customer();
Collection<Customer> data = new ArrayList<Customer>();
while (rs != null && rs.next()) {
a = new Customer();
a.setCustId(rs.getLong("CUST_ID"));
a.setPerNo(period);
a.setName(rs.getString("cust_nm"));
if(a!= null)
data.add(a);
}
Frage ich mich, ob die
a = new Customer();
ist der beste Weg, dies zu tun, oder sollte anders gemacht werden, um Speicher zu sparen und für eine optimale performance, da jede Schleife hat neue Informationen über die Kunden zu setzen. Von meinem Verständnis, wenn Sie einen neuen Kunden erstellen Sie erstellen ein neues Objekt und verweisen auf das neue Objekt. Also das alte Objekt weist darauf erhalten Abholung durch den garbage collector - das gleiche im Falle der Einstellung auf null. Ist dies ein korrektes Verständnis?
- Erstellen Sie einen neuen Kunden für jede Zeile der Ergebnismenge, sonst wirst du am Ende mit dem gleichen Objekt in der Liste die gleiche Anzahl von Zeiten als es Zeilen in der Ergebnismenge mit seiner Attribute gesetzt nach der letzten Zeile in der Ergebnismenge. Auch die null-check ist unnötige,
a
darf nicht null sein. - Es sei denn, etwas ist geschehen zwischen
a.setName
undif(a!=null)
, dassif(a!= null)
test ist völlig überflüssig. Es wird immer passieren.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich würde bevorzugen:
Warum machen Sie den Umfang größer, als es sein muss?
Ebenfalls, es sei denn, ich benötigt ein neues Objekt, das würde ich nicht schaffen, eine um Ihrer selbst Willen.
Es ist schwer zu sagen, viel mehr aus nur die Beschreibung gegeben, obwohl - wenn Sie können geben Sie eine vollständige und real-world-Beispiel, wir können in der Lage sein, um mehr konkrete Empfehlungen.
(Beachten Sie, dass es gibt keine Anzeichen dafür, dass Sie verwenden möchten Objekt immer wieder, so viel wie mit einem variable wiederholt. Sie sind sehr unterschiedliche Konzepte.)
BEARBEITEN: Suchen Sie in Ihrer speziellen Beispiel, ich würde es schreiben wie dieses:
Beachten Sie, dass diese nicht erstellen alle
Customer
Objekte, die für die garbage collection freigegeben - in der Erwägung, dass Sie Ihre original-code erstellt eine Instanz derCustomer
vor Eintritt in die Schleife, und dann ignoriert das neu erstellte Objekt, anstatt ein neues zu erstellen und neu zuweisena
's Wert.a
, sind Sie zu deklarieren, variablea
. Es ist nicht eine Frage der Effizienz - es ist eine Frage der sauberer code. Aus Effizienz-Sicht ist es egal, ob Sie deklarieren die variable innerhalb oder außerhalb der Schleife.Objekte instanziieren, wo Sie Sie benötigen. Weiß nicht wo du das nicht. Und Mach dir keine sorgen über diese Stufe der Optimierung, bis ein profiler sagt Sie.
Edit: Gegeben, Ihre aktualisierte Antwort, es wäre übersichtlicher für die Leser um die variable zu deklarieren und instanziieren Sie Ihre Kunden Objekte innerhalb der Schleife wie Jon empfohlen. Wie Sie Ihre Leistung und garbage Auflistung von Fragen, die Sie benötigen, um verbessern Sie Ihr Verständnis der grundlegenden Konzepte Sprache.
Explizit NULLing-Referenzen ist erforderlich, für spezielle Fälle, wobei Sie explizit auf "stop" und bezog sich auf ein Objekt und Versagen zu tun, so würde im Ergebnis eine tatsächliche Speicher-Leck. Als ein Beispiel, Sie können einen Blick an der Reihe gesichert
List
Umsetzung, die Null-Werte-array-slots zu vermeiden, verweist auf Referenzen/Objekte die nicht mehr verwendet werden.Ich denke, deine Verwirrung kommt nicht zu verstehen, dass Objekte per Referenz übergeben. Wenn Sie aus einer C-hintergrund, zu verstehen, dass in Java
Customer a = new Customer();
tatsächlich so etwas wieDa Sie eigentlich brauchen neue Speicher für jeden Kunde, den Sie zu Ihrer Liste hinzufügen, können Sie nicht vermeiden, erstellen Sie ein neues Customer-Objekt für jede iteration der Schleife.