Список против ArrayList
Какой из них лучше и почему?
а) List<String> list = new ArrayList<>();
б) ArrayList<String> list = new ArrayList<>();
2 ответа
Это зависит от контекста.
Если вы заботитесь только о семантике списка, а не о конкретной реализации, перейдите к List<String>
, Если вы хотите применить конкретную реализацию, перейдите к ArrayList<String>
, LinkedList<String>
или что-нибудь еще.
В большинстве случаев вы захотите продолжить работу с интерфейсом, а не с конкретной реализацией.
(а) лучше, потому что он более гибкий. Если, например, вдруг ваше требование меняется и говорит: "Вместо создания нового пустого списка массивов для назначения переменной list
мы заселим list
с элементами, отфильтрованными из другого списка ", вам нужно изменить код для этого. Вы можете изменить его на что-то вроде этого:
List<String> list = anotherList.stream().filter(x -> x.length() > 2).collect(Collectors.toList());
поскольку collect(Collectors.toList())
возвращает List
Вам также необходимо изменить тип list
если вы использовали код в (б).
Другая ситуация заключается в том, что позже вы узнали, что вам нужно назначить какой-то другой вид списка, например LinkedList
в list
, Если вы использовали код в (a), вы можете сразу назначить связанный список. Если вы использовали код в (б), вам придется вернуться к объявлению list
и измените тип.
Общая закономерность состоит в том, что по мере того, как вы используете больше "абстрактных" типов, ваш код становится более гибким, но в то же время вы можете делать меньше с переменными. Например, вы не можете использовать методы, объявленные только в ArrayList
на ваше list
переменная, но с другой стороны, другие виды списков могут быть назначены list
, Если вы еще более абстрактный тип, Collection
, тогда вы не можете использовать членов, объявленных только в List
больше, но потом все виды коллекций - Set
, Map
и т. д. - можно назначить.