Каковы различия в декларации List или ArrayList в Java?

Я новичок в Java. Я хочу знать разницу между:

List< String > list = new ArrayList<>();

и

ArrayList< String > list = new ArrayList<String>();

и

ArrayList< String > list = new ArrayList<>();

Спасибо

Ответы

Ответ 1

Первый из них действителен только с Java 7 и является эквивалентом

List<String> list = new ArrayList<String>();

Это всего лишь менее подробный.

То же самое для третьего, что эквивалентно

ArrayList<String> list = new ArrayList<String>();

и, следовательно, строго эквивалентна второму.

Вы должны предпочесть первый, по причинам, указанным в ответах на следующий вопрос: Список по сравнению с ArrayList в качестве ссылочного типа?

Ответ 2

Эти три эквивалентны:

List<String> list = new ArrayList<>();

В вышесказанном вы объявляете переменную, реализующую интерфейс List, который будет содержать элементы String, и создавайте его с помощью конкретного класса ArrayList. Кроме того, вы используете новый синтаксис Java 7, сын, вам не нужно снова писать String между <>.

ArrayList<String> list = new ArrayList<String>();

В вышесказанном вы объявляете переменную конкретного класса ArrayList, которая будет содержать элементы String, и создавайте ее с помощью конкретного класса ArrayList, используя "традиционный" синтаксис, в котором указывается, String введите <>.

ArrayList<String> list = new ArrayList<>();

В вышесказанном вы объявляете переменную конкретного класса ArrayList, которая будет содержать элементы String, и создавайте экземпляр с конкретным классом ArrayList. Кроме того, вы используете новый синтаксис Java 7, сын, вам не нужно снова писать String между <>.

Помните, что синтаксис алмаза (<>) будет работать только в Java 7 и выше, для предыдущих версий Java вы застряли с использованием традиционного синтаксиса (<the-type>) для создания экземпляров генериков.

Последние две формы полностью эквивалентны; первая форма немного отличается, поскольку вы указываете, что переменная List имеет тип List, а не тип ArrayList - и что предпочтительная форма, так как хорошие объектно-ориентированные методы диктуют, что вы должны для "интерфейса" , а не "реализации" .

Ответ 3

Здесь есть два момента:

1. Новый алмазный оператор Java 7 позволяет вам создать экземпляр универсального класса без указания параметра типа с обеих сторон. Итак, эти два эквивалента:

ArrayList< String > list = new ArrayList<String>();
ArrayList< String > list = new ArrayList<>();

2. Более важным моментом является различие между первыми двумя экземплярами. Второй ясно:

ArrayList< String > list = new ArrayList<String>();

В первом:

List< String > list = new ArrayList<>();

вы используете тот факт, что ArrayList является подтипом List, и поэтому присваивание действительно. Однако на новом объекте List у вас есть только подмножество методов, включенных в List (потому что ваш объект объявлен как List в конце концов), но с реализациями, присутствующими в ArrayList. Это называется полиморфизмом в объектно-ориентированном программировании и позволяет использовать подтип класса вместо родителя, где ожидается родительский элемент, чтобы обеспечить различные различные функции.