Снижение производительности при прохождении базового класса Java?

#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-это точно такой же объект, с точно таким же типом. На самом деле, обращение к нему как к коллекции является хорошей объектно-ориентированной практикой, поскольку вы ссылаетесь на объект по его контракту, а не по его реализации.