Что такое List или ArrayList?

Каковы основные различия между этими двумя объектами? Является ли еще более эффективным? Есть ли у вас больше методов?

Ответ 1

Список находится в интерфейсе, а ArrayList - это класс.

См. ArrayList и List.

Например, вы не можете использовать эту настройку:

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).