Ich arbeite derzeit mit vielen verschachtelten Level-Objekten und dachte über die Leistung nach.Java - Nested Level Objektzuordnung
Also lassen Sie uns sagen, ich habe die folgenden Klassen:
class Address {
private String doorNumber;
private String street;
...
}
und eine andere Klasse Kunden.
class Customer {
private List<Address> addressList;
private String firstName;
.....
.....
.....
}
und wenn ich versuche, darauf zuzugreifen wie unten:
public static void main(String[] str) {
Customer customer = new Customer();
// ... and add addresses to this Customer object.
// Set 1
// And if I then do...
customer.getAddressList().get(0).getHouseNumber();
customer.getAddressList().get(0).getStreet();
// OR
// Set 2
Address address = customer.getAddressList().get(0);
address.getHouseNumber();
address.getStreet()
}
Ich weiß, dass die erste Gruppe von Linien, die die Adresse zuzugreifen, ist nicht sauber Code, und ich nahm an der Compiler diese Art würde, aber es tut es nicht. Denn wenn ich meinen Code dekompiliere, bekomme ich genau das gleiche zurück, bin also nicht sicher, ob der Compiler dort irgendwelche Optimierungen vornimmt. Also meine erste Frage ist, warum nicht der Compiler dies aufräumt und es einer temporären Variable zuweist?
Und meine nächste Frage ist, hat das etwas mit Leistung zu tun? Und welcher ist der optimalere performante Code der beiden, abgesehen von dem ersten nicht sehr sauberen Code. Bedeutet es, dass meine zweite Codezeile intern während der Kompilierung in die erste Zeile übersetzt wird?
Und schließlich die letzte, ist es optimal Variablen auf eine Klasse als seine Getter-Methode aufzurufen? Ich denke nur hier Leistung ohne saubere Codierung.
Die zweite Version wird besser funktionieren, besonders wenn 'addressList' eine' LinkedList <> 'oder eine andere' List <> 'ist, wobei' get' nicht 'O (1)' ist. (Angenommen, Sie werden tiefer graben als das erste Element.) – bradimus
Danke @bradimus. Die Idee ist, dass ich bei der Variablenzuweisung fleißig sein muss oder macht der Java-Compiler irgendwelche Optimierungen? Bin nicht sicher. –
Sie können die Leistung selbst überprüfen, indem Sie ein Benchmarking durchführen. Führen Sie den Code einige Male in einer Schleife aus und messen Sie die Zeit mit 'System.nanoTime()'. –