В части ArrayList есть пять статей, и для анализа вводится временная сложность,Настоятельно рекомендуется прочитать по порядку, эта статья первая.
В статье несколько дней назад повторяющиеся рисунки и повторяющиеся повторы просто для того, чтобы все поняли, что представляет собой объект в памяти. Он также закладывает основу для сегодняшних и будущих объяснений. Если вы хотите сказать, какой класс вы используете чаще всего при написании Java-кода, я думаю, что это в основном ArrayList помимо String, то сегодня мы поговорим об ArrayList.
Во-первых, ArrayList — это обычный класс., давайте посмотрим на кусок кода:
Первый: выполнить List
Примечание: Константный пул находится в области методов, а область методов находится в куче памяти, раньше он не был задействован, поэтому область методов не рисовалась, а теперь добавлена.
Что ж, поскольку это ново, давайте начнем непосредственно с конструктора и посмотрим, что делает конструктор.
Очень просто, всего одна строка кода, продолжайте смотреть, что такое this.elementData и DEFAULTCAPACITY_EMPTY_ELEMENTDATA соответственно.
Содержимое в красной рамке кажется вам знакомым? Да, как и у String, нижний слой — это массив, разница только в том, что нижний слой у String — это массив char[] (можете пересмотреть, если забыли, портал:String - очень распространенный класс - материал Java), а вот массив Object[], что означает, что в массив можно поместить любой объект (все объекты наследуются от родительского класса Object), после выполнения конструктора, как показано ниже.
Примечание: статические измененные переменные находятся в области методов. Нам не нужны новые. JVM заранее инициализирует их для нас. Эта функция часто используется в качестве кеша в реальном процессе разработки. существуетСбивающий с толку Java-код — Java ThingВ статье кеш Integer в нашей статье лучший пример. Статические переменные также называются переменными класса.Независимо от того, сколько объектов в классе, есть только одна статическая переменная, которая уникальна.
Окончательно измененные переменные, JVM также инициализирует нас заранее.
Ключевое слово transient говорит нам игнорировать этот элемент при сериализации объекта.Мы поговорим о сериализации позже, но пропустим ее здесь.
Продолжить выполнение: List
Автор класса ArrayList очень внимателен. Даже кеш учитывается, когда он новый. Чтобы избежать повторного создания бесполезных массивов, все базовые массивы вновь созданного ArrayList указывают на массив Object[], кэшированный в области методов.
Продолжить выполнение Person person1 = new Person("Чжан Сан")
Продолжить, выполнить list1.add(person1), особо нечего сказать, посмотрите, как исходный ArrayList обрабатывает add.
Давайте сначала посмотрим на метод sureCapacityInternal. Одним из параметров в методе является размер. Давайте посмотрим, откуда берется этот размер.
Оказалось, что это переменная-член, я думаю, все поймут, что это такое, увидев размер. Что ж, мы добавляем его к объекту ArrayList на рисунке, size — это базовый тип данных int, а переменная-член инициализируется 0.
продолжай смотреть вниз
Внутри add вызывается метод sureCapacityInternal.
Посмотрите еще раз на метод роста
Следуйте классу инструментов Arrays, который очень прост
Посмотрите еще раз на метод copyOf()
Наконец, давайте посмотрим на метод System.arraycopy().Странно, что этот метод только определен, но не реализован.Метод украшен нативом. Нативный метод реализуется другими языками, обычно (C или C++), поэтому здесь нет кода реализации. Это метод копирования массива Вы все еще пишете циклы for для копирования массивов? Используйте этот метод чаще в будущем, он прост и удобен, и вы можете получить более высокую производительность.
Примечание. Нативный метод, мы объясним его позже, сначала мы сосредоточимся на содержании этой главы.
Поскольку содержимое массива в настоящее время пусто, это эквивалентно отсутствию копии. После стольких метаний оказалось, что нужно просто создать массив Object[] с длиной по умолчанию 10. Некоторые друзья говорили, что достаточно просто сделать new. статьи в нем.
Оглядываясь назад, можно сказать, что метод add() продолжает выполняться:
Очень просто, размер теперь равен 0, то есть входящий е (здесь человек1) помещается в массив с индексом 0 у elementData[] списка1, а размер увеличивается на 1, старое правило, картинка выше.
Обратите внимание, что в красной коробке, хотя длина массива ElementData в нашем list1 составляет 10, размер 1, а размер - это логическая длина, а не длина массива.
Теперь отладьте, проверьте содержимое нашей карты:
Хорошо, выполните код в начале этой статьи и посмотрите результат:
Кстати, взгляните на исходный код метода size():
Некоторые люди говорят, ах, только один элемент занимает 10 позиций в куче памяти, что является пустой тратой, нет никакого способа, вы должны пожертвовать пространством как ценой, чтобы насладиться удобством и богатым API ArrayList.
Примечание. Эта колонка была впервые опубликована в общедоступной учетной записи: sayayJava. Все примеры кодов были загружены на официальный аккаунт, обратите внимание на загрузку, если вам это нужно.
Если вам нравится эта серия статей, пожалуйста, поставьте лайк или поделитесь со мной. Ваша поддержка является движущей силой для меня, чтобы продолжать. Вы также можете оставить сообщение в области комментариев. Если у вас есть возможность, эта колонка объяснит это. Наконец , не забудьте обратить внимание. Проверьте меня.
Перепечатка приветствуется, но с указанием "автора" и "оригинального адреса". При перепечатке просьба сохранить этот абзац в тексте, спасибо за соблюдение авторских прав. Для коммерческого воспроизведения или публикации, пожалуйста, свяжитесь с автором для получения разрешения.
Предыдущий:Разговор о равных в Java (посередине) - эти вещи в Java
Следующий:Основной принцип расширения массива ArrayList - эти вещи в Java