Чем больше вы знаете, тем больше вы не знаете
Ставьте лайки и смотрите снова, формируйте привычку
эта статьяGitHub github.com/JavaFamilyОн включен, есть ментальная карта точек собеседования заводов первого уровня, а также организовано множество моих документов. Добро пожаловать в Звезду и совершенствуйтесь. Вы можете обратиться в тестовый центр для ознакомления во время собеседования. , Я надеюсь, что у нас есть что-то вместе.
текст
Грациозная дама в рубашке, держащая изящный блокнот, подошла прямо ко мне и села передо мной.
Глядя на эту красивую женщину передо мной, я подумал, что это может быть не интервьюер серии «Основы Java», она действительно ароматная.
Но кажется, что такой молодой не должен быть в состоянии задать какую-либо глубину, хи-хи. (О? Правда 😏)
Шуай Си, с момента последнего интервью прошло две недели, так почему же оно заняло у вас так много времени?
Привет, прекрасный и очаровательный интервьюер, потому что я болел гриппом раньше и чуть не умер, а недавнее собрание в конце года и обзор на конец года, я слишком занят, извините.
Я также сделал волну режиссеров (на самом деле, по дому), чтобы снять видео о ежегодном собрании Могуцзе Я был так занят, что не мог опубликовать статью на выходных, ха-ха.
Ну тогда я понимаю, в следующий раз, когда такое случится, не забудь сказать мне заранее, да, пей больше горячей воды.
Интервьюер выпил еще горячей воды в конце, что прямо коснулось моей внутренней линии защиты.Есть еще люди, которые так заботятся обо мне.Углы глаз Шуай Цин снова мокрые...
Использовался ли когда-нибудь ArrayList? Что это? Для чего это можно использовать?
Используется, ArrayList представляет собой список массивов, в основном используемый для загрузки данных, когда мы загружаем основные типы данных int, long, boolean, short, byte... мы можем хранить только их соответствующие классы-оболочки, его основной базовой реализацией является массив Объект[]элементДанные.
Похож на него LinkedList.По сравнению с LinkedList, его скорость поиска и доступа к элементам выше, но скорость добавления и удаления медленнее.
резюме: нижний уровень ArrayList — это хранилище, реализованное с помощью массивов.
Функции: Эффективность запроса высокая, эффективность добавления и удаления низкая, а поток небезопасен. Частота использования высокая.
Почему thread unsafe все еще использует его?
Поскольку в наших сценариях обычного использования все они используются для запросов и не требуют слишком частых добавлений и удалений. Если задействованы частые добавления и удаления, вы можете использовать LinkedList. Если вам нужна безопасность потоков, используйте Vector. В этом разница между тремя.В процессе разработки ArrayList по-прежнему используется наиболее часто.
Не существует инструмента сбора, который имеет высокую эффективность запросов, высокую эффективность добавления и удаления и потокобезопасность.Что касается того, почему вы можете видеть код, потому что характеристики структур данных сосуществуют, трудно найти баланс. производительность, затем безопасность, жертвуя безопасностью, а затем быстротой.
Tip: Здесь я хотел бы подчеркнуть каждыйне использовать ради, я помню, у меня была эта проблема, когда я только начал работать. Неважно, 3721, он просто для использования, я использую его, когда его используют другие, и меня не волнует его производительность, потокобезопасный он или нет, к счастью, компания впервые вышла на связь с автономной системой и ничего параллелизма.
Сейчас, оглядываясь назад, я немного напуган, и когда я впервые вышел на собеседование, начальник алгоритма оскорбил меня. На самом деле, я бы использовал все, что он просил, но я просто не мог сказать, почему я использовал это или почему я это сделал.
Вспоминая первое интервью год назад, я думаю об обрывках того времени,Тогда рядом со мной была женщина, тогда у меня еще были волосы, и тогда... уголки моих глаз снова были мокрыми.
Вы сказали, что его основная реализация представляет собой массив, но размер массива фиксирован.Если мы будем продолжать добавлять в него данные, не будет ли проблем?
ArrayList может указать размер базового массива путем построения при инициализации.
ArrayList() инициализируется методом построения без параметров, а базовому числу Object[] elementData назначается пустой массив по умолчанию Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {}, поэтому емкость массива равна 0, а значение по умолчанию выделяется только тогда, когда данные фактически добавляются DEFAULT_CAPACITY = начальная емкость 10.
Вы можете посмотреть на его конструктор без параметров и конструктор с параметрами соответственно, ни один параметр не является размером по умолчанию, и есть параметры, чтобы судить о собрании.
Длина массива ограничена, а ArrayList может хранить любое количество объектов, и длина не ограничена, так как же он этого достигает?
На самом деле способ реализации относительно прост, и реализуется он посредством расширения массива.
Например, теперь у нас есть массив длиной 10. Теперь мы хотим добавить элемент и обнаружить, что он полон.Что будет делать ArrayList?
На первом шаге он переопределит массив длины 10+10/2, то есть добавит массив длины 15.
Затем скопируйте данные исходного массива в новый массив без изменений, а затем измените адрес, указывающий на исходный номер, на новый массив, и ArrayList завершит преобразование.
Совет: Многие друзья говорили, зачем вы используете массив длиной в 10 в качестве примера, так что вам нужно нарисовать немного больше сетки, красавчик C, я буду делать бессмысленные вещи? Поскольку обычно мы не устанавливаем размер начального значения при использовании ArrayList, размер ArrayList по умолчанию равен ровно 10.
Затем вы также можете увидеть, что в его методе построения, если вы передаете начальное значение size, то используете параметры, которые вы передали, если нет, то используйте значение по умолчанию, все прослеживается.
Не подскажете чем отличается инициализация версии 1.7 и 1.8?
ArrayList1.7 начал немного меняться, один при инициализации, до 1.7, this(10) будет называться реальной емкостью 10, 1.7 сама по себе является пустым массивом по умолчанию, только в первый раз емкость будет добавлена становится 10.
Почему размер массива по умолчанию размер ArrayList 10?
На самом деле конкретных причин я не нашел.
Говорят, что это потому, что программисты Sun провели исследование ряда широко используемых программных кодов, и в результате массив длины 10 является наиболее часто используемым и наиболее эффективным. Также говорят, что это случайное число, между 8 и 12 нет никакой разницы, просто потому, что массив из 10 относительно полный.
Я помню, вы упомянули, что он очень медленно добавляет и удаляет, можете ли вы сказать мне, как ведет себя ArrayList при добавлении и удалении? В основном скажи мне, почему он медленный.
Эх*, дай подумать, я забыл прочитать в колледже, дай подумать.
Ну да ладно, о его новой логике расскажу отдельно.
Он указал индекс для добавления, а некоторые добавили напрямую.Перед этим у него будет шаг для проверки длины суждения.ensureCapacityInternal, то есть если длины не хватает, ее нужно расширить.
При расширении емкости старая версия JDK отличается от версии после 8. Эффективность после 8 более высокая, и используется битовая работа.переместить вправоОдин бит на самом деле является операцией деления на 2.
Когда 1,7 равно 3/2+1, 1,8 равно 3/2.
Когда указанное место добавлено, операция после проверки очень проста, то есть копия массива, вы можете посмотреть код.
не знаю, все понимаютarraycopyКода нет, я рисую пояснение к схеме, может вы немного поняли:
Например, если есть массив, подобный следующему, мне нужно добавить элемент A в позиции индекса 5.
Из кода видно, что он скопировал массив, начиная с позиции индекса 5, а затем поместил его на позицию индекса 5+1.
Освободите место для элемента, который мы хотим добавить, а затем поместите элемент A в позицию индекса, чтобы завершить новую операцию.
Что касается того, почему он считается неэффективным, я думаю, вы должны знать, если я этого не скажу. Я работаю только в таком маленьком списке. Если я добавлю элемент в список размером в сотни тысяч десятков тысячи, то все следующие элементы нужно копировать, а потом, если это связано с расширением или чем-то еще, это будет медленнее, верно?
Позвольте мне задать вам реальную сцену.Мало кто знает этот вопрос.Вы должны хорошо ответить на него!
Будет ли ArrayList(int initialCapacity) инициализировать размер массива?
В чем проблема? Какого черта, вы можете попросить ArrayList слепое пятно знаний?
Не паникуйте, я помню, как Бинг Бинг сказал: «Независимо от того, с какими трудностями мы столкнемся, не бойтесь, лучший способ преодолеть страх — это встретиться с ним лицом к лицу!» ! ! Оля, дай! ! ! …
инициализирует размер массива! Но размер списка не меняется, потому что размер списка возвращает размер.
А использование конструктора в связке с initialCapacity и последующее использование set() выдает исключение, несмотря на то, что массив создан, размер задан неправильно.
Использование sureCapacity() также не работает, потому что оно основано на массиве elementData, а не на размере.
Есть и другие побочные эффекты, это из-за статического DEFAULT_CAPACITY с sureCapacity().
Единственный способ заставить это работать — использовать add() столько раз, сколько необходимо после использования конструктора.
Вы можете быть немного сбиты с толку. Я буду непосредственно работать с кодом. Вы обнаружите, что хотя мы устанавливаем начальный размер ArrayList, когда мы печатаем размер списка, он по-прежнему равен 0. Когда мы оперируем установленным значением нижнего индекса будет сообщено об ошибке, а нижний индекс массива выходит за пределы.
По факту массив инициализируется, а List нет, размер не изменился, и установленный индекс сравнивается с размером, после чего сообщается об ошибке.
В сочетании с исходным кодом, пожалуйста, внимательно прочитайте.Это классическая проблема в Java Bug, и она по-прежнему очень интересна.В обычное время вы можете не обращать на это внимание.
Вставка и удаление ArrayList должны быть медленными?
В зависимости от того, как далеко от конца массива вы удаляете элементы, ArrayList может подойти в качестве стека.Операции push и pop вообще не связаны с перемещением данных.
Так как же произошло его удаление?
Удаление на самом деле то же самое, что и добавление, но оно называется удалением, а в коде мы обнаружили, что он все-таки копирует массив.
Зачем копировать массив?
Продолжая аналогию, теперь мы хотим удалить позицию index5 в следующем массиве
В этом коде он копирует массив, начиная с index5+1, в конец, а затем помещает его в начало индекса.
Позиция index5 успешно «удалена», что на самом деле перезаписывается, создавая ощущение удаления.
Точно так же его эффективность также низка, потому что, если массив очень большой, позиция, которую нужно скопировать и переместить, будет большой.
Является ли ArrayList потокобезопасным?
Конечно, нет, поточно-ориентированной версией контейнера массива является Vector.
Реализация Вектора очень проста, то есть все методы объединены с СИНХРОНИЗИРОВАННЫМ.
Вы также можете использовать Collections.synchronizedList, чтобы обернуть обычный ArrayList в потокобезопасную версию контейнера массива без использования Vector.Принцип тот же, что и у Vector, который заключается в применении слоя synchronized ко всем методам.
Подходит ли ArrayList для очереди?
Очереди, как правило, FIFO (первым пришел, первым вышел).Если вы используете ArrayList в качестве очереди, вам нужно добавить данные в конец массива, удалить массив в начале массива и наоборот.
Но в любом случае всегда будет операция по перемещению данных массива, более требовательная к производительности.
в заключении: ArrayList не подходит для очереди.
Подходит ли массив для очереди?
Эта женщина дьявол? Но все равно надо улыбаться!
Массивы очень подходят.
Например, внутренняя реализация ArrayBlockingQueue представляет собой циклическую очередь, то есть очередь фиксированной длины, а внутренняя реализация представляет собой массив фиксированной длины.
Кроме того, известная библиотека Disruptor с открытым исходным кодом также представляет собой сверхвысокопроизводительную очередь, реализованную кольцевым массивом, конкретный принцип которой не объясняется, и он более сложен.
Проще говоря, два смещения используются для обозначения позиции чтения и позиции записи массива.Если длина превышена, он вернется к началу массива, при условии, что они являются массивами фиксированной длины.
Как обход ArrayList сравнивается с производительностью обхода LinkedList?
Обход ArrayList намного быстрее, чем LinkedList.Самым большим преимуществом обхода ArrayList является непрерывность памяти.Внутренняя структура кэша ЦП будет кэшировать последовательные сегменты памяти, что может значительно снизить накладные расходы на чтение памяти.
Вы можете поговорить со мной о LinkedList?
Ладно, а то сегодня уже поздно, или поговорим в следующий раз?
Что ж, каждый раз, когда вы оправдываетесь, в следующий раз вы можете собрать последнюю главу, давайте хорошо поболтаем, вы готовы.
Суммировать
ArrayList — динамический массив, в MSDN — сложная версия Array, обеспечивает динамическое добавление и вычитание элементов, реализует интерфейсы ICollection и IList, гибко устанавливает размер массива.
В интервью нет HashMap, ConcurrentHashMap или чего-то такого, что так часто спрашивают, но есть определенная вероятность спросить, или то предложение,Не вступайте в неопределенные сражения.
В процессе чтения исходного кода нам не нужно читать их все. Нам нужно прочитать основной исходный код и углубить наше понимание концепций. Когда мы его используем, нам не нужно знать все. Не используйте его только ради использования. Хорошо.
Краткое изложение часто используемых методов ArrayList
- boolean add(E e)
Добавляет указанный элемент в конец этого списка.
- void add(int index, E element)
Вставляет указанный элемент в указанную позицию в этом списке.
- boolean addAll(Collection c)
Добавляет все элементы указанной коллекции в конец этого списка в порядке элементов, возвращаемых итератором для указанной коллекции.
- boolean addAll(int index, Collection c)
Вставляет все элементы указанной коллекции в этот список, начиная с указанной позиции.
- void clear()
Удаляет все элементы из этого списка.
- Object clone()
Возвращает поверхностную копию этого экземпляра ArrayList.
- boolean contains(Object o)
Возвращает true, если этот список содержит указанный элемент.
- void ensureCapacity(int minCapacity)
При необходимости увеличивает емкость этого экземпляра ArrayList, чтобы гарантировать, что он может содержать по крайней мере количество элементов, указанное параметром минимальной емкости.
- E get(int index)
Возвращает элемент в указанной позиции в этом списке.
- int indexOf(Object o)
Возвращает индекс первого появления указанного элемента в этом списке или -1, если этот список не содержит элементов.
- boolean isEmpty()
true, если в этом списке нет элементов
- int lastIndexOf(Object o)
Возвращает индекс последнего вхождения указанного элемента в этом списке или -1, если этот список не содержит индекса.
- E remove(int index)
Удаляет элемент в указанной позиции в этом списке.
- boolean remove(Object o)
Удаляет первое вхождение указанного элемента в этом списке, если он существует.
- protected void removeRange(int fromIndex, int toIndex)
Удаляет все элементы в списке с индексами между fromIndex (включительно) и toIndex (исключительно).
- E set(int index, E element)
Заменяет элемент в указанной позиции в этом списке указанным элементом.
- int size()
Возвращает количество элементов в этом списке.
- Object[] toArray()
Возвращает массив, содержащий все элементы в этом списке в правильном порядке (от первого к последнему элементу).
- T[] toArray(T[] a)
Возвращает массив, содержащий все элементы в этом списке в правильном порядке (от первого к последнему элементу); тип возвращаемого массива во время выполнения совпадает с типом указанного массива.
- void trimToSize()
Настраивает емкость этого экземпляра ArrayList в соответствии с текущим размером списка.
Обратите внимание, не потеряйтесь
Хорошо всем, это все содержание этой статьи. Люди, которые могут видеть это здесь, всеталант.
Каждую неделю я буду обновлять несколько статей, связанных с интервью и общими технологическими стеками ведущих интернет-компаний, большое спасиботалантМы можем видеть здесь, если эта статья хорошо написана, я думаю, что «Ао Бин» ячто-тоеслиПожалуйста, лайкните 👍 Пожалуйста, следите за ❤️ поделитесь пожалуйста 👥Это правда для меняочень полезно! ! !
Проституция нехороша, творить нелегко,Ваша поддержка и признание — самая большая мотивация для моего творчества, увидимся в следующей статье!
Ао Бин | Текст [Оригинал]
Если в этом блоге есть какие-либо ошибки, пожалуйста, критикуйте и советуйте, это очень ценится!
Статья постоянно обновляется каждую неделю, вы можете искать в WeChat "Третий принц Ао Бин"Читать и запрашивать обновления в первый раз (на одну-две статьи раньше, чем в блоге), эту статьюGitHub github.com/JavaFamilyОн был включен, есть ментальная карта точек интервью производителей первого уровня, а также я организовал много своих документов. Добро пожаловать в Звезду и совершенство. Вы можете обратиться в тестовый центр для ознакомления во время интервью. , Я надеюсь, что у нас есть что-то вместе.