Возможный дубликат:
Список против ArrayList
Разница между
ArrayList al = new ArrayList()
и
List al = new ArrayList() ?
Возможный дубликат:
Список против ArrayList
Разница между
ArrayList al = new ArrayList()
и
List al = new ArrayList() ?
Нет, с точки зрения создания. Оба создают экземпляр ArrayList.
Различие заключается в том, что во втором примере al разрешает доступ ко всем методам, реализованным в интерфейсе List, в то время как в первом примере al разрешает доступ ко всем (доступным) методам и полям ArrayList класс.
Практическое эмпирическое правило: используйте второй шаблон. Если вам нужны дополнительные плюсы от реализации ArrayList, вы всегда можете использовать:
List list = new ArrayList();
// do some adds/removes/... on the list
((ArrayList) list).trimToSize();
Его называемое программированием для интерфейса. Предположим, вам нужно вернуть этот list из вашего метода. Таким образом, вызывающий код может иметь это в переменной list.
public ArrayList getList() {
ArrayList list = new ArrayList();
// do something with the list here
return list;
}
И это,
public List getList() {
List list = new ArrayList();
// do something with the list here
return list;
}
Теперь для последнего метода вызов кода может иметь возвращенный список в переменной list type. И вы можете легко решить позже, почему-то, что-то вроде этого,
public List getList() {
List list = new LinkedList();
// do something with the list here
return list;
}
Никакого изменения кода вызова, в то время как с первым вам нужно изменить тип возврата, который в конечном итоге также испортит вызывающий код.
Перефразируя мой ответ на этот очень похожий вопрос о Map vs. HashMap:
Нет никакой разницы между объектами. В интерфейсе, который у вас есть, есть разница. В первом случае интерфейс ArrayList, а во втором - List. Основной объект, тем не менее, тот же.
Преимущество использования List заключается в том, что вы можете изменить базовый объект на другой тип списка, не нарушая контракт с любым кодом, который его использует. Если вы объявите его как ArrayList, вы должны изменить свой контракт, если хотите изменить базовую реализацию.