Пожалуйста, указывайте первоисточник при перепечатке, спасибо!
скажи это прямо
Если вы молча идете по дороге жизни, вам нужен свет, который будет вести вас! А эта лампа — всего лишь приговор, приговор ободрения, похвалы, признания, одобрения, знакомства и обмена...
Предыдущая статья:Али Руководство по разработке JAVA Нулевой уровень мышления и понимания (1)получить автораОдинокийЭто небольшое волнение.Я буду продолжать усердно работать и продолжать читать и думать над руководством по разработке Ali JAVA.Ведь каждый пункт - это яма, на которую наступили предшественники и подведены через уроки крови.
Обзор предыдущей темы
Прочитав это, я думаю, что главноеОперации, связанные с коллекцией, в Основах JAVAсобиратьВажность этой части действительно очень важна (в конце концов, она наиболее часто используется), этот вопрос будет выполнять только некоторые простые расширения в сочетании с вышеуказанными вопросами и не будет охватывать все операции над набором, а также не затрагивает поток безопасность комплектов.будет в моей серииВысокий параллелизм, серия блокировокРасширьте вглубь.
Важность коллекций
Зачем существует коллекция, когда уже есть массив?Я до сих пор четко помню характеристики последовательной структуры и цепной структуры в структуре данных. Здесь массив относится к последовательной структуре (но коллекция может быть реализована в соответствии с последовательной структурой или цепной структурой, поэтому, по крайней мере, вам нужно немного подумать, когда вы решите использовать ее вместо того, что использовать).
Как только массив определен, его длина не может быть изменена. А массив это просто ряд переменных.Для многих повторяющихся операций(нет единой абстракции) и некоторые последовательные структуры не подходят,нужна реализация цепной структуры или комбинации последовательных структур и цепных структур.Более подходящая.
Примечание:Для многих повторяющихся операций, например, если вам нужно расширить, вам нужно реализовать это самостоятельно, и эффективность реализации различна в зависимости от уровня кодирования (и это может быть в большом количестве, это нужно реализовать всем, что не в русле инженерной мысли), а например, его нужно отсортировать, добавить, удалить, пройти и т.д.
Некоторые из вышеперечисленных проблем вводили коллекции и решали эти проблемы, поэтому коллекции очень важны, и коллекции можно увидеть повсюду в проекте, а данные в db и nosql нужно получить.
Рассмотрим некоторые характеристики коллекций:
- Эта структура высокопроизводительна, эффективна для базовых коллекций (динамические массивы, связанные списки, деревья и хеш-таблицы) и тщательно протестирована (надежна в отношении производительности, безопасности и т. д.).
- Коллекции позволяют работать с коллекциями разных типов одинаково.
- Коллекции легко расширять и модифицировать.
Обходное мышление множеств
Обход коллекции, из инженерии нам нужно предоставить способ последовательного доступа к каждому элементу в объекте коллекции,без раскрытия внутреннего представления объекта.
Как это может быть сделано? ? ? Режим итератора может это сделать, давайте вместе разберемся.
шаблон итератора
Основная функция шаблона итератора — обеспечить итеративный доступ к агрегатным объектам. В основном этодоступподнять шумиху. Так зачем использовать шаблон итератора? Каковы преимущества?
- Существует много типов объектов-коллекций.Если итеративный доступ к объекту-коллекции интегрирован с самим объектом-коллекцией, это серьезно повлияет на масштабируемость и удобство сопровождения объекта-коллекции.
Примечание:Ключевая идея паттерна итератора состоит в том, чтобы отделить обход и доступ к объекту-коллекции от объекта-коллекции и вынести его в отдельный итератор, чтобы объект-коллекция стал проще, а итератор и объект-коллекцию можно было бы самостоятельно менялись и развивались, что значительно повышает гибкость системы классов.
В основном используются внешние итераторы (этап управления клиентом следующего элемента итератора заключается в том, что в коде нам нужно вручную вызвать next для итерации следующего элемента, который должен быть гибким)
- Новая функция foreach (расширенная версия для), представленная после JDK5.
Примечание:Используя javap для просмотра декомпилированного кода в массиве, это неотъемлемая реализация foreach, которая напрямую перебирает массив, в то время как итеративный foreach в контейнере реализуется через итератор.
Сделайте немного больше постельных принадлежностей
-
ArrayList реализует интерфейс Iterator
Примечание:Существует два типа итераторов, реализованных в ArrayList: один — обычный вперед-назад, а второй — двунаправленный итеративный вывод, который может быть прямым или обратным.
решение проблем
Столько всего было сказано выше, думаю, можно приступать к решению задачи уже сейчас, судьи долго ждали. Еще одна важная тема — ряд параллелизма.Давайте не будем рассматривать параллелизм для анализа.Если вы работаете параллельно, вам нужно заблокировать объект Iterator, что должно быть легко понять.
This field is used by the iterator and list iterator implementation returned by the iterator and listIterator methods. If the value of this field changes unexpectedly, the iterator (or list iterator) will throw a ConcurrentModificationException in response to the next, remove, previous, set or add operations. This provides fail-fast behavior, rather than non-deterministic behavior in the face of concurrent modification during iteration.
Use of this field by subclasses is optional. If a subclass wishes to provide fail-fast iterators (and list iterators), then it merely has to increment this field in its add(int, E) and remove(int) methods (and any other methods that it overrides that result in structural modifications to the list). A single call to add(int, E) or remove(int) must add no more than one to this field, or the iterators (and list iterators) will throw bogus ConcurrentModificationExceptions. If an implementation does not wish to provide fail-fast iterators, this field may be ignored.
Поэтому следует отметить, что не только включать remove, но и использовать метод Iterator для добавления элементов.
Этот стандарт является обязательным и показывает важность.Следовать приведенным выше передовым практикам правильно.
public static void main(String[] args) {
List<String> list = new ArrayList<String>();
list.add("1");
list.add("2");
for(String item:list){
if("1".equals(item)){ //(1 换成 if("2".equals(item)){
list.remove(item);
}
}
}
Когда (1 заменяется на if("2".equals(item)){, текущий результат ненормальный, и результат показан на рисунке:
На самом деле выдается такая ошибка, и количество строк кода оказывается очень удобным для поиска проблемы.На самом деле, фокус проблемы заключается в том, что все это основано на выводе Iterator, но это должен быть правильный способ удаления элементов.
Не нужно беспокоиться о том, почему 1 хорошо, а 2 неправильно, это можно увидеть, посмотрев исходный код, на самом деле мы можем сделать и 2 хорошим, но так это реализовано в jdk, его объяснение и рассмотрение заключаются в следующем.
причина
Итераторы, возвращаемые методами итератора и listIterator этого класса ArrayList, являются отказоустойчивыми: после создания итератора список нельзя изменить каким-либо образом в любое время, если только список не изменен структурно с помощью собственных методов удаления или добавления итератора. .Modification, итератор выдаст исключение ConcurrentModificationException. Таким образом, перед лицом одновременных модификаций итератор полностью выйдет из строя раньше, чем риск произвольного неопределенного поведения в какой-то неопределенное время в будущем.
Так что лучше всего, как в Руководстве по разработке Java для Ali, и используйте метод Iterator для элемента add.
Использование итератора на практике
Может быть, закончив говорить, всем кажется, что итераторы используются только для обхода коллекции, и они уже существуют. На самом деле, на практике действительно есть некоторые применения. Во всяком случае, они повсюду контролируют доступ, например, пейджинг. Это очень распространенное явление. ситуации.Исходя из подкачки базы данных, я боюсь плохой производительности.Если она полностью в памяти (память слишком дорогая, слишком много данных, нереально), общая практика заключается в использовании 20 частей данных на странице.Мы можем вообще извлекать 5 страниц каждый раз, когда мы запрашиваем базу данных.Память (в частности, сколько брать каждый раз, можно анализировать в соответствии с поведением пользователя, и получается более разумный, и чем больше вы переходите к более позднему, тем меньше шансов у вас есть получить доступ к памяти, тем меньше памяти вы можете занять.Вы можете сначала брать n страниц данных каждый раз, например, после того, сколько страниц берется, m страниц берется каждый раз, а затем одна страница берется по одной странице за раз .n>m>1). Тогда, например, 100 фрагментов данных, которые вынимаются, должны быть доступны в соответствии с пейджингом, а исходный jdk, похоже, не устраивает, поэтому очень гибко реализовать аналогичный? Если в будущем у меня будет время, я опубликую серию статей в своем публичном аккаунте WeChat.техническое мышлениеЕсть подобный анализ.
считать
Это одна из деталей руководства по разработке Ali JAVA,Ждем ваших комментариев и анализа! ! !
Если вы найдете это полезным после прочтения, ставьте лайк и подписывайтесь.
Проверьте больше истории, добро пожаловать, чтобы обратить внимание на личный публичный аккаунт! ! !