В чем разница между массивом и ArrayList в Java?

Добрый день господа. Может кто подскажет мне в чем разница между обычным массивом данных, например int[] cats = new int[10] и ArrayList, например ArrayList list = new ArrayList()?
  • Вопрос задан
  • 17362 просмотра
Решения вопроса 1
Fesor
@Fesor
Full-stack developer (Symfony, Angular)
int[] cats = new int[10] в памяти выглядит как непрерывная область память заполненная значениями и равная sizeof(int) * 10. Преимущества - если вы часто обращаетесь и бегаете по коллекции элементов то массивы обеспечат вам максимальную производительность только за счет индексной адресации и меньшего количества кэш-мисов (гуглить свойство локальности данных). Минусы - фиксированный размер, заресайзить можно до не удобно и дорого в плане производительности.

ArrayList же это список, обычный такой вот список. То есть каждый элемент связан друг с другом через указатели. Плюсы - легко добавлять и удалять элементы. Минусы - элементы созданные в разное время могут оказаться в память черти где, что может привести к большому количеству кэш-мисов. Короче траверсинг по списку банально медленнее.

В зависимости от задачи имеет смысла выбирать то или иное решение.

Updated: справедливости ради поправлю себя же. ArrayList это реализация списка на массивах, так что все чуть сложнее. Описанный мной случай - LinkedList, но суть все та же - просто массивы - фиксированный размер, ArrayList - размер динамический.
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
halogen
@halogen
Java developer
Что сходу так вспомнил, хотя могу ошибаться:

-МассивыList
Изменение размеранетда
Сложность доступа к элементувсегда O(1)зависит от реализации List
Поддержка семантики "только для чтения"нет (вариант обхода в простых случаях: клонирование массива)да (с использованием read-only-декоратора Collections.unmodifiableList(List))
"Ровная" интеграция в систему типовнет (массивы являются своего рода особым случаем организации объектов; в отличии от .NET не имеет никакого array-типа в качестве базового типа)да
Поддержка примитивных типовданет ("тяжёлые" объекты для примитивов; слегка нивелируется наличием factory-методов типа Integer.valueOf(int); вариант обхода: FastUtils или Trove)
Проверка типа присваиваемых объектовв момент присваивания элемента массива или его инициализациив момент вытягивания элемента списка и интерпретации его на стороне, которая использует список
Взаимные преобразованиямассив из списка: List.toArray() всегда возвращает новый массив объектов типа Object; List.toArray(T[]) позволяет указать приготовленный буфер для не-примитивов; преобразование в массив примитивов не поддерживается напрямуюсписок из массива: Arrays.asList(T...) без проблем, если массив является массивом объектов, а не примитивных типов; если массив является массивом примитивов, Arrays.asList() возвращает список с одного элемента, считая входной массив единственным объектом, хотя существуют варианты типа Ints.asList(int[]) из Guava
Возможность узнать общий тип всех элементовданет (из-за стирания типов; можно узнать тип элемента только по-отдельности при доступе к каждому элементу)
.toString()-представлениенет (всегда имеет вид "[T@IDENTITY", где T - тип массива, IDENTITY - уникальный ID объекта; требуется использование Arrays.toString())да (зависит от реализации, в общем случае "[n1, n2, n3...]")
Реализация for-обходачерез счётчик для доступа к каждому элементучерез итератор с помощью реализации Iterable
Ответ написан
Комментировать
Примитивы (int, long, float и т.п.) нельзя хранить в ArrayList. Если будешь добавлять в Collection примитив, то произойдет автобоксинг
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы