Три предположения ArrayList

Java программист Java EE Язык программирования

В части ArrayList есть пять статей, и для анализа вводится временная сложность,Настоятельно рекомендуется прочитать по порядку, связанные статьи:

1,Инициализация ArrayList - столбец Java те вещи

2,Принцип расширения массива, лежащий в основе ArrayList - столбец Java те вещи

3.Временная сложность — Колонка Java The Things

4. Эта статья

В третий раз ArrayLIst — нормальный класс.

Хорошо, теперь давайте обсудим удаление массива. Мы знаем, что после создания массива в памяти кучи длина массива неизменна. См. следующий исходный код:

Добавить 10 пользователей

Например, мы хотим удалить из массива человека «неделя восьмая», как показано на рисунке:

Мы можем только прокрутить массив и найти индекс 5 «Выходные». Поскольку массив не предоставляет метод удаления, мы можем только присвоить позиции с индексом 5 значение null (вызывая дыру в массиве), а Человек объект "Weekend" На него больше нет ссылок, и механизм сборки мусора JVM со временем уберет его. Но длина массива по-прежнему равна 10. В следующий раз, когда мы зациклимся, чтобы найти кого-то, будет сообщено об исключении нулевого указателя, если мы не будем осторожны. Хотя мы можем написать ненулевое значение, чтобы судить, это все еще не очень удобно. Мы копируем все ссылки на элементы после нуля и копируем его. вперед. Одна копия, заполните нуль, как показано ниже

После копирования:

Ссылки ref после null копируются по порядку в исходную нулевую позицию, исходная ссылка 1 перезаписывается, но точка отсчета в perArr[9] остается неизменной (обратите внимание, что копирование не перемещается, посмотрите внимательно Посмотрите на две картинки над).
Примечание: perArr[8], perArr[9] указывают на один и тот же объект, это, очевидно, не тот результат, который нам нужен, и чтобы снова с ним справиться, мы присваиваем ссылке perArr[9] значение null. Как показано ниже:

Проблема кажется решенной, но длина массива по-прежнему равна 10, и вам нужно поддерживать размер самостоятельно, чтобы записать длину.Мы должны написать код для копирования вышеприведенного массива самостоятельно.,К счастью, класс ArrayList реализован., просто оставьте ему работу по копированию массива. Нам нужно только вызвать удаление, предоставленное классом ArrayList, чтобы удалить элементы. Что касается того, как копировать базовый массив и как удалять элементы, это зависит от самого объекта ArrayList. (объектно-ориентированныйИдея​​), давайте рассмотрим два способа удаления элементов ArrayList, первый — удаление по индексу:

Давайте сначала посмотрим на элемент перед удалением и отладим его:

В perList уже 10 элементов, выполните эти две операции удаления, а потом посмотрите на отладочную ситуацию

«Восьмая неделя» с индексом 5 была удалена, элементы после индекса 5 также перемещены вперед на одну позицию в соответствии с нашим предыдущим предположением, а последняя позиция массива также установлена ​​​​на ноль.странность! «Сунь Ци» не удален!Напечатанное число также 9

Давайте посмотрим на исходный код двух методов удаления.

В основном так же, как анализ на нашем рисунке, и использование размера для записи реального количества элементов, этот код также вызывает метод метода rangeCheck(), давайте посмотрим:

Это так просто, правильно, это проверить, не выходит ли нижний индекс базового массива за пределы. Давайте посмотрим на другой способ удаления

Еще раз взгляните на метод fastRemove().

В соответствии с описанным выше методом удаления индекса я не буду вдаваться в подробности.

Я полагаю, что когда вы видите знакомый метод equals() выше, вы, вероятно, понимаете, почему "Sun Qi" не был удален.Если вы пишете класс (Person), вам нужен этот класс для идеальной поддержки List, выКод должен быть написан согласно спецификации List, мы находимся в
Разговор о равенстве в Java (посередине) - Java The Things ColumnВ статье это уже было очень ясно, поэтому я не буду здесь вдаваться в подробности.

Зная причину проблемы, решить ее легко, давайте перепишем метод equals() и попробуем.

После перезаписи метода equals выполните его и снова отладьте.

Sun Qi удалили, и все, кто стоит за Sun Qi, тоже скопировали на один блок вперед, последняя позиция нулевая, а размер тоже 8, а потом рисуем картинку:

«Sun Qi» и «Weekly Eight» на рисунке не имеют к ним никакого отношения, и виртуальная машина JVM переработает их в соответствующее время.

Поговорим об удалении элементов в ArrayList.временная сложность.В ArrayLIst, если базовый массив имеет длину n.

Когда мы используем подписку для удаления элементов, если последний элемент удален, базовая копия массива не будет запущена, а временная сложность равна O(1). Если i-й элемент удален, базовый массив будет скопирован n-i раз в соответствии сВ худшем случае временная сложность составляет O(n).

С этой точки зрения эффективность удаления заданных элементов в ArrayList не кажется слишком высокой, поскольку удаление элементов приведет к копированию базового массива.LinkedListРешение есть, обратите внимание на последующие статьи в колонке.

В примере объект используется для удаления элемента, просто хочу сказать вам, что этот метод удаления заключается в использовании метода equals для поиска нижнего индекса элемента, а затем его удаления.В реальной работе редко можно встретить новый объект для удаления.Не рекомендуется сначала переопределять метод equals, если у вас нет особых потребностей. Если вы переопределяете метод equals, пожалуйста, переопределите и метод hashCode.Разговор о равенстве в Java (посередине) - Java The Things ColumnВ статье уже было сказано.

Предыдущий:Временная сложность — Колонка Java The Things

Следующий:Временная сложность ArrayList — столбец Java The Things

Примечание. Эта колонка была впервые опубликована в общедоступной учетной записи: sayayJava. Все примеры кодов были загружены на официальный аккаунт, обратите внимание на загрузку, если вам это нужно.

Если вам нравится эта серия статей,Пожалуйста, поставьте лайк или поделитесь для меня, ваша поддержка является движущей силой для меня, чтобы продолжать. Вы также можете оставить сообщение в области комментариев, чтобы узнать, что вы хотите знать. Если у вас есть возможность, эта колонка объяснит это. Наконец, не забудьте заплатить внимание ко мне.

Перепечатка приветствуется, но с указанием "автора" и "оригинального адреса". Пожалуйста, сохраните этот абзац в тексте для перепечатки, спасибо за уважение авторских прав. Для коммерческого воспроизведения или публикации, пожалуйста, свяжитесь с автором для получения разрешения.