#java #performance
Вопрос:
Я хочу использовать Collection
тип, который известен во время компиляции ( ArrayList
). Существует ли какое-либо наказание за прохождение через интерфейс родительского класса?
Collection<Integer> v = new ArrayList<>();
v.add(42);
против
ArrayList<Integer> v = new ArrayList<>();
v.add(42);
В C первый случай приведет к вызову виртуальной функции, но не ко второму. То же самое происходит и на Яве?
Ответ №1:
Java использует динамическую привязку для всех вызовов методов, поэтому разницы нет (они одинаково плохи, если хотите, с оговоркой, что оптимизация JIT, вероятно, сделает их одинаково хорошими).
Ответ №2:
Нет, никакого наказания нет. Ваш ArrayList-это точно такой же объект, с точно таким же типом. На самом деле, обращение к нему как к коллекции является хорошей объектно-ориентированной практикой, поскольку вы ссылаетесь на объект по его контракту, а не по его реализации.