0

в чем разница?

ArrayList<E> arrayList = new ArrayList<E>();

List<E> arrayList = new ArrayList<E>(); // Map<E> map = new HashMap<>();

Как я понял, ArrayList имплементирует интерфейс List,

public class ArrayList<E> extends AbstractList<E>
        implements List<E>, RandomAccess, Cloneable, java.io.Serializable

тогда в чем смысл использовать вторую запись, если ArrayList реализует больше методов и полей?

2 Answers2

0

Это делается согласно конвенции. Такая форма записи вам дает преимущества. Допустим вы создаете список в таком виде:

List<E> arrayList = new ArrayList<E>();

потом поработав с ним, оказывается, вам необходимо удалять множество значений из списка. Но arrayList для такого не подходит (он медленный при удалении объектов, ввиду внутренней реализации). Окей, не проблема. Вы берете переменную arrayList и ссылаете ее на LinkedList

arrayList=new LinkedList<>();

(не забыв перенести элементы). И LinkedList позволит вам эффективно удалять элементы из листа. При создании листа как arraylist - вы бы так не смогли сделать. То есть это намного удобней, вы создаете объект как Лист и в дальнейшем не паритесь о его реализации, вы просто знаете что это Лист. Вы к ней не привязаны - и можете манипулировать объектом, и в любой момент можете изменить его реализацию. Короче, прям реально ощутимых преимуществ это не дает, просто так удобней.

had0uken
  • 1,560
  • 2
  • 4
  • 17
  • Можно сказать, что ArrayList реализует сам себя и по этому ему не доступны другие реализации? – Mrian _ Jul 04 '22 at 11:23
  • ну фактически ArrayList это класс, а не интерфейс, поэтому не понятно что подразумевается под реализацией ArrayLista, но по сути, можно и так сказать – had0uken Jul 04 '22 at 12:00
0

Необходимо программировать на уровне интерфейсов, а не их реализаций. Т.е необходимо делать List<E> arrayList = new ArrayList<>();, а не ArrayList<E> arrayList = new ArrayList<>(); ,Map<K,V> map = new HashMap<>();, а не HashMap<K,V> map = new HashMap<>();. Также делать и с параметрами у методов, это позволяет использовать все прелести полиморфизма.