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