Каковы основные различия между этими двумя объектами? Является ли еще более эффективным? Есть ли у вас больше методов?
Что такое List или ArrayList?
Ответ 1
Список находится в интерфейсе, а ArrayList - это класс.
Например, вы не можете использовать эту настройку:
List<String> list = new List<String>();
... Потому что это интерфейс.
Однако это работает:
ArrayList<String> arrayList = new ArrayList<String>();
Также... Вы можете сделать, как говорит duffymo ниже, что более или менее равнозначно реализации интерфейса List
(создание собственной реализации списка).
Ответ 2
Рассмотрим следующую строку:
List<String> names = new ArrayList<String>();
Если вы новичок в объектно-ориентированных архитектурах, вместо этого вы могли бы ожидать чего-то вроде ArrayList<String> names = new ArrayList<String>();
. В конце концов, вы только что сказали, что это новый ArrayList
, поэтому вы не должны хранить его в переменной типа ArrayList
?
Ну, вы, конечно, можете это сделать. Однако List
- это интерфейс, похожий на шаблон, который называется ArrayList
. Это контракт, в котором говорится: "В любое время, когда вы используете реализацию List
, вы можете ожидать, что эти методы будут доступны". В случае List
методы такие вещи, как add
, get
и т.д.
Но ArrayList
- это только одна реализация List
. Существуют и другие, такие как LinkedList
. Оба имеют один и тот же интерфейс и могут использоваться одинаково, но работают по-разному за кулисами. Где ArrayList
является "случайным" доступом, что означает, что он непосредственно находит конкретный элемент массива без итерации по всему списку, LinkedList
должен начинать с первого элемента и идти один за другим, пока он не достигнет необходимый элемент.
Дело в том, что вам нужно указать, что вы хотите, когда вы создаете объект, вам обычно нужно только сообщать не больше, чем тот факт, что это List
, поэтому вы просто говорите, что это такое. List
сообщает, что у вас есть коллекция, которая должна быть в том порядке, в котором она задана. Если вам не нужно так много общаться, вы можете рассмотреть его как Collection
, который представляет собой другой интерфейс (супер-интерфейс List
). Или, если все, что вам нужно для общения, это то, что вы можете перебирать его, вы можете даже назвать его Iterable
.
Ответ 3
Список - это интерфейс; ArrayList - это класс, реализующий интерфейс List.
Интерфейсы определяют сигнатуры метода, которые требуются, но не говорят о том, как они реализованы.
Классы, реализующие интерфейс, обещают предоставить публичные реализации методов с идентичными сигнатурами, объявленными интерфейсом.
Ответ 4
A List
определяет интерфейс, который использует ArrayList
, который позволяет ему реализовывать методы, которые позволят всем другим классам, которые реализуют List, использоваться вместе или аналогичным образом. ArrayList
всегда есть List
, но List
не обязательно ArrayList
.
То есть ArrayList
реализует List
(среди нескольких других интерфейсов).
Ответ 5
Как использовать List и ArrayList
или другую реализацию List, является Polymorphism
и Inheritance
, а также причина использования таких языков, как Java.
В простоте полиморфизм - это много форм, а наследование - повторное использование.
Здесь может быть много видов конкретных и готовых к нам списков, таких как ArrayList, Vector
, LinkedList
и Stack
. Решение использовать, которое исходит от вас, и если вы посмотрите на Список API, вы заметите, что все эти реализации List расширяются одним способом или другой из списка.
Ответ 6
Согласно java docs, List - это просто интерфейс, а ArrayList - один из классов, которые его реализуют. Нет никакого присущего преимущества эффективности использования ArralyList специально вместо ссылок на List в типичном объекте ArrayList.
Однако, когда дело доходит до "эффективности", между различными реализациями интерфейса List может быть разница. Например, может быть небольшая разница в эффективности между LinkedList и ArrayList, в зависимости от того, как вы их используете.
Чтобы процитировать java-документы на странице ArrayList,
Операция add выполняется в режиме амортизированного постоянного времени, то есть для добавления n элементов требуется время O (n). Все остальные операции выполняются в линейном времени (грубо говоря). Постоянный коэффициент невысок по сравнению с константой для реализации LinkedList.
Другими словами, разница в производительности, вероятно, будет незначительной, но вы можете увидеть некоторые преимущества использования ArrayList (в отличие от LinkedList).
Если вам интересно, ArrayList реализуется с массивом, который время от времени изменяется (скорее всего, когда ваша коллекция удваивается по размеру), что сильно отличается от реализации LinkedList (подробнее см. wikipedia).