В настоящее время я работаю с множеством объектов вложенного уровня и думал о производительности.Java - Назначение объекта вложенного уровня
Так скажем, у меня есть следующие классы:
class Address {
private String doorNumber;
private String street;
...
}
и другого класса Customer.
class Customer {
private List<Address> addressList;
private String firstName;
.....
.....
.....
}
и когда я пытаюсь получить доступ к нему, как показано ниже:
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()
}
Я знаю, что первый набор линий для доступа к адресу не является чистым кодом, и я предположил, что компилятор будет разобраться в этом, но это не так. Потому что, когда я декомпилирую свой код, я получаю точно то же самое, поэтому не уверен, что компилятор делает какие-либо оптимизации там. Поэтому мой первый вопрос заключается в том, почему компилятор не очищает его и не назначает ему временную переменную?
И мой следующий вопрос: это как-то связано с производительностью? И это более оптимальный код исполнения двух, кроме первого не очень чистого кода. Означает ли это, что мой второй набор строк кода будет внутренне переводиться первым во время компиляции?
И, наконец, последнее, более оптимально ли вызывать переменные в классе, чем метод его получения? Я просто думаю о производительности здесь без чистого кодирования.
Вторая версия будет работать лучше, особенно если 'addressList' является' LinkedList <> 'или некоторым другим' List <> 'where' get' не' O (1) '. (Предположим, вы будете копать глубже первого элемента.) – bradimus
Спасибо @bradimus. Идея заключается в том, что я должен быть усердным в отношении назначения переменных или компилятор Java делает какие-либо оптимизации? Я не уверен. –
Вы можете проверить производительность самостоятельно, сравнив ее. Запустите код несколько thoudsand раз в цикле и измерьте время с помощью 'System.nanoTime()'. –