В части ArrayList есть пять статей, и для анализа вводится временная сложность,Настоятельно рекомендуется прочитать по порядку, связанные статьи:
1,Инициализация ArrayList - столбец Java те вещи
2,Принцип расширения массива, лежащий в основе ArrayList - Java те вещи, столбец
3.Временная сложность — Колонка Java The Things
4.Three Guess ArrayList - Колонка Java The Things
5. Временная сложность ArrayList — Java те вещи, столбец (эта статья)
В предыдущих статьях мы видели исходный код метода add, и есть метод add, давайте посмотрим, public void add(int index, E element) , добавить элементы из указанной позиции
Добавляем элемент в указанную позицию по нижнему индексу, как всем известно, переходим непосредственно к исходному коду.
Старое правило, мы по-прежнему рисуем картинку, когда выполняется метод System.arraycopy()
Я видел несколько книг, в которых говорится, что элементы последовательно перемещаются в следующую сетку, что недостаточно строго.Итак, я повторяю, заключается в том, чтобы копировать позицию вставки и следующие за ней элементы массива по очереди, в следующую ячейку, а не перемещать, поэтому после копирования arr[2], arr[3] указывают на один и тот же объект.
После того, как код выполнит это предложение
Давайте отладим, чтобы проверить.
Наконец, создайте объект Li Mochou в памяти кучи и укажите на него ссылку arr[2].
отладить это снова
Наконец, давайте поговорим о временной сложности, добавляемой к объекту ArrayLIst:
Если мы добавим элемент напрямую без указания позиции (add(E element)), элемент будет добавлен в конец по умолчанию, и копирование базового массива не будет запущено, независимо от автоматического расширения базового массива. ,Временная сложность O (1), добавьте элемент в указанную позицию (добавить (индекс int, элемент E)), вам нужно скопировать базовый массив, согласнохудший вариант,Временная сложность O(n).
Наконец, давайте поговорим о чтении элементов.Следующий код предназначен для получения элемента с индексом 2 в списке.
Взгляните на исходный код:
Очень просто, чтение элементов не имеет ничего общего с длиной массива и напрямую получает элементы из базового массива.
Кто-то в области комментариев сказал, почему это «Li Mochou», похоже, ему не очень нравится «Li Mochou», мы можем вызвать метод set(int index, E element), чтобы заменить его.
Давайте посмотрим на исходный код этого метода.
Это очень просто, просто поместите элемент в указанную позицию и вернитесь к исходному элементу, и, наконец, нарисуйте картинку.
На рисунке "Li Mochou" не имеет ссылки на него, и JVM переработает его, когда это необходимо. Вторая позиция базового массива была заменена на "Little Dragon Girl". Давайте отладим, чтобы проверить это.
Верно, его заменила маленькая девочка-дракон.
Это последний анализ исходного кода ArrayLIst, который представляет временную сложность Наконец, давайте проведемСуммировать:
Согласно предыдущим статьям, мы можем видеть, что в ArrayList,Эффективность хранения/выборки элементов в базовом массиве очень высока (получить/установить), а временная сложность O(1), тогда как эффективность поиска, вставки и удаления элементов не кажется очень высокой, а временная сложность O (n).
Когда в нашем массиве много данных, на этот раз, когда в нем часто вставляются/удаляются элементы, это вызовет частое копирование базового массива, эффективность не высока, а трата памяти также приведет к трате памяти. космос., эта проблема имеет решение в другом классе: LinkedList, пожалуйста, с нетерпением ожидайте объяснения в следующей статье.
Поиск элементов не эффективен, есть решение в HashMap, обратите внимание на последующие статьи.
Предыдущий:Three Guess ArrayList - Колонка Java The Things
Следующий:Разница между Arraylist и Vector - столбец Java те вещи
Примечание. Эта колонка была впервые опубликована в общедоступной учетной записи: sayayJava. Все примеры кодов были загружены на официальный аккаунт, обратите внимание на загрузку, если вам это нужно.
Если вам нравится эта серия статей,Пожалуйста, поставьте лайк или поделитесь для меня, ваша поддержка является движущей силой для меня, чтобы продолжать. Вы также можете оставить сообщение в области комментариев, чтобы узнать, что вы хотите знать. Если у вас есть возможность, эта колонка объяснит это. Наконец, не забудьте заплатить внимание ко мне.
Перепечатка приветствуется, но с указанием "автора" и "оригинального адреса". Пожалуйста, сохраните этот абзац в тексте для перепечатки, спасибо за уважение авторских прав. Для коммерческого воспроизведения или публикации, пожалуйста, свяжитесь с автором для получения разрешения.